Android 高級繪圖

      網友投稿 854 2022-05-29

      刷子

      可以畫什么?

      從Paint中完成工作

      使用透明度

      // 使用紅色,并讓它50%透明

      int opacity = 127;

      int intColor = Color.argb(opacity, 255, 0, 0);

      int parsedColor = Color.parseColor("#7FFF0000");

      或者,也可以使用setAlpha方法來設置已存在的Paint對象的透明度:

      // 讓顏色50%透明

      int opacity = 127;

      myPaint.setAlpha(opacity);

      Shader介紹

      Paint shaderPaint = new Paint();

      shaderPaint.setShader(myLinearGradient);

      定義漸變Shader

      int colorFrom = Color.BLACK;

      int colorTo = Color.WHITE; LinearGradient linearGradientShader = new LinearGradient(x1, y1, x2, y2, colorFrom, colorTo, TileMode.CLAMP)

      int[] gradientColors = new int[3];

      gradientColors[0] = Color.GREEN;

      gradientColors[1] = Color.YELLOW;

      gradientColors[2] = Color.RED;

      float[] gradientPositions = new float[3];

      gradientPositions[0] = 0.0f;

      gradientPositions[1] = 0.5f;

      gradientPositions[2] = 1.0f;

      RadialGradient radialGradientShader=new RadialGradient(centerX,centerY, radius, gradientColors, gradientPositions, TileMode.CLAMP);

      使用Shader TileModes

      CLAMP

      使用Shader的邊界顏色來填充剩余的空間。

      MIRROR

      在水平和垂直方向上拉伸Shader圖像,這樣每一個圖像就都能與上一個縫合了。

      REPEAT

      在水平和垂直方向上重復Shader圖像,但不拉伸它。

      使用MaskFilter

      BlurMaskFilter

      指定了一個模糊的樣式和半徑來處理Paint的邊緣。

      EmbossMaskFilter

      指定了光源的方向和環境光強度來添加浮雕效果。

      // 設置光源的方向

      float[] direction = new float[]{ 1, 1, 1 };

      //設置環境光亮度

      float light = 0.4f;

      // 選擇要應用的反射等級

      float specular = 6;

      // 向mask應用一定級別的模糊

      float blur = 3.5f;

      EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);

      // 應用mask myPaint.setMaskFilter(emboss);

      使用ColorFilter

      ColorMatrixColorFilter

      可以指定一個4×5的ColorMatrix并將其應用到一個Paint中。ColorMatrixes通常在程序中用于對圖像進行處理,而且由于它們支持使用矩陣相乘的方法來執行鏈接轉換,所以它們很有用。

      LightingColorFilter

      乘以第一個顏色的RGB通道,然后加上第二個顏色。每一次轉換的結果都限制在0到255之間。

      PorterDuffColorFilter

      可以使用數字圖像合成的16條Porter-Duff 規則中的任意一條來向Paint應用一個指定的顏色。

      使用PathEffect

      CornerPathEffect

      可以使用圓角來代替尖銳的角從而對基本圖形的形狀尖銳的邊角進行平滑。

      DashPathEffect

      可以使用DashPathEffect來創建一個虛線的輪廓(短橫線/小圓點),而不是使用實線。你還可以指定任意的虛/實線段的重復模式。

      DiscretePathEffect

      與DashPathEffect相似,但是添加了隨機性。當繪制它的時候,需要指定每一段的長度和與原始路徑的偏離度。

      PathDashPathEffect

      這種效果可以定義一個新的形狀(路徑)并將其用作原始路徑的輪廓標記。

      SumPathEffect

      順序地在一條路徑中添加兩種效果,這樣每一種效果都可以應用到原始路徑中,而且兩種結果可以結合起來。

      ComposePathEffect

      將兩種效果組合起來應用,先使用第一種效果,然后在這種效果的基礎上應用第二種效果。

      borderPaint.setPathEffect(new CornerPathEffect(5));

      修改Xfermode

      AvoidXfermode

      指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。

      PixelXorXfermode

      當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。

      PorterDuffXfermode

      這是一個非常強大的轉換模式,使用它,可以使用圖像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。

      AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); borderPen.setXfermode(avoid);

      使用抗鋸齒效果提高Paint質量

      myPaint.setSubpixelText(true);

      myPaint.setAntiAlias(true);

      Android 高級繪圖

      2D圖形的硬件加速

      myActivity.requestWindowFeature(Window.FEATURE_OPENGL)

      Canvas繪圖最佳實踐經驗

      考慮硬件加速

      OpenGL硬件加速對2D圖形的支持是非常好的,所以你總是應該考慮它是否適合你的活動。另一種比較優秀的方法是只用一個單獨的View和迅速的、耗時的更新來組成活動。一定要保證你使用的基本圖形能夠被硬件支持。

      考慮大小和方向

      當在設計View和布局的時候,一定要保證考慮(和測試)它們在不同的分辨率和大小下的外觀。

      只創建一次靜態對象

      在Android中對象的創建是相當昂貴的。因此,在可能的地方,應用只創建一次像Paint對象、Path和Shader這樣的繪圖對象,而不是在View每次無效的時候都重新創建它們。

      記住onDraw是很消耗資源的

      執行onDraw方法是很消耗資源的處理,它會強制Android執行多個圖片組合和位圖構建操作。下面有幾點建議可以讓你修改Canvas的外觀,而不用重新繪制它:

      使用Canvas轉換

      可以使用像rotate和translate這樣的轉換,來簡化Canvas中元素復雜的相關位置。例如,相比放置和旋轉一個表盤周圍的每一個文本元素,你可以簡單地將canvas旋轉22.5?,然后在相同的位置繪制文本。

      使用動畫

      可以考慮使用動畫來執行View的預設置的轉換,而不是手動地重新繪制它。在活動的View中可以執行縮放、旋轉和轉換動畫,并可以提供一種能夠有效利用資源的方式來提供縮放、旋轉或者抖動效果。

      考慮使用位圖和9 Patch

      如果View使用了靜態背景,那么你應該考慮使用一個圖片,如位圖或者9 patch,而不是手動地重新繪制。

      Android Canvas

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Netty基礎必備知識,ByteBuffer和ByteBuf底層原理
      下一篇:Database之SQLSever:SQLSever數據庫管理人員國家職業資格證書中級、高級考試知識點總結
      相關文章
      亚洲美女人黄网成人女| 亚洲欧洲日韩不卡| 亚洲精品福利网泷泽萝拉| 国产亚洲精品久久久久秋霞| 亚洲av中文无码| 色噜噜噜噜亚洲第一| 亚洲国产成人久久综合| 亚洲综合一区二区三区四区五区| 亚洲人6666成人观看| 亚洲一级在线观看| 亚洲av成人一区二区三区| 亚洲色图黄色小说| 亚洲最新中文字幕| 亚洲国产综合在线| 亚洲一区二区三区无码国产| 亚洲午夜电影在线观看| 亚洲国产精品人久久电影| 亚洲av无码久久忘忧草| 亚洲中文字幕无码一去台湾| 亚洲中文字幕久久久一区| 亚洲精品乱码久久久久蜜桃| 久久精品国产亚洲av天美18 | 婷婷亚洲综合五月天小说| 久久精品国产亚洲AV麻豆~| 亚洲av激情无码专区在线播放| 亚洲AV综合色一区二区三区| 亚洲avav天堂av在线不卡| 亚洲资源在线观看| 亚洲人成网站在线观看播放动漫 | 久久精品亚洲一区二区三区浴池| 久久精品国产精品亚洲毛片| 亚洲最大在线观看| 亚洲fuli在线观看| 亚洲狠狠色丁香婷婷综合| 国产精品亚洲天堂| 久久久久国产亚洲AV麻豆| 亚洲国产精品SSS在线观看AV| 亚洲人成在线影院| 亚洲专区一路线二| 亚洲精品蜜夜内射| 国产亚洲综合久久|