自定義View
對自定義View一直很模糊,剛好最近不太忙,系統性的總結一下。自定義View主要有以下幾個知識點:
- Canvas:可以它為一個畫布,用于承載View中的所有元素(基礎)
- Paint:作為畫筆的存在,用來加特效的(基礎)
- 裁切和幾何變換:通過限定在某些區域繪制以及對view進行變換達到指定效果(進階)
Canvas
-
可以通過drawXxx()方法畫出下列簡單圖形:
- drawCircle():圓
- drawPoint():點
- drawLine():線
- drawLines():多條線
- drawRect():長方形
- drawArc():弧
- drawOwal():橢圓
- drawRoundRect():圓角矩形
通過drawPath()畫出復雜的圖形
通過drawBitmap()畫圖片
通過drawText()畫圖片
Paint
setColor():設置顏色
-
setShader(Shader shader):設置著色器,Shader有以下幾種子類:
-
LinearGradient 線性漸變,兩個點之間的顏色線性漸變
Shader.TileMode,著色規則有三種,CLAMP、MIRROR、REPEAT,以下同。
RadialGradient 輻射漸變,從圓心向四周進行輻射漸變
SweepGradient 掃描漸變,從圓的0角度,旋轉進行掃描漸變
BitmapShader 圖片著色器,將圖片作為著色器,比如可以用來做圓型頭像的裁剪
-
ComposeShader 混合著色器,一個Paint中使用兩個著色器,混合用
PorterDuff.Mode,是用來指定兩個著色器公共繪制時的顏色策略,是一個enum,共17個。
大體分為兩類,Alpha 合成 (Alpha Compositing)、混合 (Blending)
-
-
setColorFilter(ColorFilter colorFilter):為繪制設置顏色的過濾。可用于制作濾鏡效果。ColorFilter有三個子類:
- LightingColorFilter,用來模擬簡單的光照效果。
- PorterDuffColorFilter,使用一個指定的顏色和一種指定的 PorterDuff.Mode 來與繪制對象進行合成。
- ColorMatrixColorFilter,使用一個 ColorMatrix 來對顏色進行處理,是一個4*5的矩陣(有點厲害,不知道怎么用),StyleImageView
setXfermode(Xfermode xfermode),只有一個子類PorterDuffXfermode
setAntiAlias (boolean aa) 設置抗鋸齒
setStyle(Paint.Style style)
setStrokeWidth(float width)
setStrokeCap(Paint.Cap cap)
setStrokeJoin(Paint.Join join)
setStrokeMiter(float miter)
setDither(boolean dither)
setFilterBitmap(boolean filter)設置是否使用雙線性過濾來繪制 Bitmap 。
setPathEffect(PathEffect effect):PathEffect 分為兩類,單一效果的 CornerPathEffect DiscretePathEffect DashPathEffect PathDashPathEffect ,和組合效果的 SumPathEffect ComposePathEffect。
setShadowLayer(float radius, float dx, float dy, int shadowColor)
setMaskFilter(MaskFilter maskfilter)
setTextSize()等
范圍裁切和自由變換
-
范圍裁切
使用canvas的clipRect()和clipPath(),這兩個方法進行裁切,注意使用Canvas.save()和Canvas.restore()保存和恢復Canvas的狀態
-
自由變換
-
使用 Canvas 來做常見的二維變換;
Canvas.translate(float dx, float dy) 平移
Canvas.rotate(float degrees, float px, float py) 旋轉
Canvas.scale(float sx, float sy, float px, float py) 放縮
Canvas.skew(float sx, float sy) 錯切 -
使用 Matrix 來做常見和不常見的二維變換;
1.創建 Matrix 對象;
2.調用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法來設置幾何變換;
3.使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 來把幾何變換應用到 Canvas。
4.Matrix.setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 用點對點映射的方式設置變換 -
使用 Camera 來做三維變換。 Camera 的三維變換有三類:旋轉、平移、移動相機。注意使用Camera的sava()、restore()、reset()等方法,大致與Canvas的類似
1.旋轉:Camera.rotateX(),Camera.rotateY(),Camera.rotateZ(),Camera.rotate() 三維旋轉;注意Camera的旋轉中心,一般的需要配合Canvas的translate(),將旋轉中心切換為遠點進行旋轉;然后用camera.applyToCanvas(canvas); // 把旋轉投影到 Canvas
2.平移:Camera.translate(float x, float y, float z)
3.移動相機:Camera.setLocation(x, y, z) 設置虛擬相機的位置,注意這個方法它的參數的單位不是像素,而是 inch,英寸
-