Android 高級繪圖
刷子
可以畫什么?
從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);
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小時內刪除侵權內容。