甘肅省住房和城鄉(xiāng)建設廳注冊中心網(wǎng)站首頁交換鏈接適用于哪些網(wǎng)站
Paint部分常用的方法
- 1、實例化之后Paint的基本配置
- 2、shader 和 ShadowLayer
- 3、pathEffect
- 4、maskFilter
- 5、colorFilter
- 6、xfermode
1、實例化之后Paint的基本配置
- Paint.Align
Align指定drawText如何將其文本相對于[x,y]坐標進行對齊。默認為LEFT - Paint.Cap
Cap指定了筆畫線和路徑的開始和結束的處理方法 [BUTT(筆畫以路徑結束,并且不超出路徑),ROUND(筆畫凸出成半圓形,圓心在路徑的末端),SQUARE(筆畫突出為一個正方形,中心位于路徑的末端)] - Paint.FontMetrics
類,它描述給定文本大小下字體的各種指標。記住,Y值向下增大,所以這些值是正的,而距離向上的值是負的。這個類由getFontMetrics()返回。 - Paint.Join
連接指定了線條和曲線段在描邊路徑上連接的處理。默認為MITER。 - Paint.Style
樣式指定所繪制的原語是填充的、描邊的,還是兩者都有(用相同的顏色)。默認為FILL - isAntiAlias抗鋸齒
- isDither防抖動
- color畫筆的顏色
- strokeWidth畫筆的寬
這里省略其他配置…
2、shader 和 ShadowLayer
簡單列子實現(xiàn)效果
列1
private fun jcPaint(canvas: Canvas?) {Paint().apply {setShadowLayer(12f, 5f, 5f, Color.RED)isLinearText = trueval array = IntArray(2)array[0] = Color.YELLOWarray[1] = Color.BLUE/*實現(xiàn)線性顏色效果*/shader = LinearGradient(0f,0f,100f,100f,array,null,Shader.TileMode.MIRROR)color = Color.REDstrokeWidth = 10fstyle = Paint.Style.STROKEstrokeCap = Paint.Cap.BUTTstrokeJoin = Paint.Join.ROUND //連接處的處理canvas?.drawRect(Rect(10, 10, 400, 400), this)val text1 = "style - Paint.Style.STROKE"val text2 = "Cap - Paint.Cap.BUTT"val text3 = "Join連接處使用圓角 - Paint.Join.ROUNDJoin"strokeWidth = 2ftextSize = 30fcolor = Color.BLUEstyle = Paint.Style.FILL_AND_STROKEPaint.ANTI_ALIAS_FLAG/*** 繪制陰影*/this.setShadowLayer(2f, 0f, 5f, Color.BLUE)canvas?.drawText(text1, 20f, 200f, this)val tW = this.measureText(text1)Log.v("[measureText]", "tw = $tW")canvas?.drawText(text2, 20f, 300f, this)canvas?.drawText(text3, 20f, 400f, this)}}
列2
private fun shader(canvas: Canvas?) {/*** 圍棋子 黑色棋子*/Paint(Paint.ANTI_ALIAS_FLAG).apply {color = Color.REDstrokeWidth = 10fstyle = Paint.Style.FILLstrokeCap = Paint.Cap.BUTT //結尾處strokeJoin = Paint.Join.ROUND //連接處的處理val top = 600fval left = 30fval radius = 100fshader = RadialGradient(left + radius, top ,radius+radius*1/4,IntArray(2).apply {this[0] = Color.WHITEthis[1] = Color.BLACK},null,Shader.TileMode.CLAMP)/*** 添加陰影*/setShadowLayer(6f, 6f, 6f, Color.parseColor("#AACCCCCC"))canvas?.drawCircle(left + radius, top, radius, this)shader = SweepGradient(0F,0f, listOf<Int>(Color.YELLOW,Color.RED).toIntArray(),null)canvas?.drawCircle(left + radius * 3, top, radius, this)
//
///*** 實現(xiàn)線性顏色效果*/shader = LinearGradient(0f,0f,100f,100f,listOf<Int>(Color.GREEN,Color.BLUE).toIntArray(),null,Shader.TileMode.MIRROR)canvas?.drawCircle(left + radius * 5, top, radius, this)val b = BitmapFactory.decodeResource(context.resources,R.mipmap.aa)shader = BitmapShader(b,Shader.TileMode.MIRROR,Shader.TileMode.MIRROR)canvas?.drawCircle(left + radius * 7, top, radius, this)}}
3、pathEffect
1、DiscretePathEffect() 將路徑切成segmentLength的行,隨機偏離原路徑。
2、SumPathEffect() 構造一個PathEffect,其效果是按順序應用兩個效果。(例如,第一個(路徑)+第二個(路徑))
3、DashPathEffect() interval數(shù)組必須包含偶數(shù)個條目(>=2),偶數(shù)索引指定“開”間隔,奇數(shù)索引指定“關”間隔。Phase是interval數(shù)組的偏移量(對所有interval的和取mod)。interval數(shù)組控制破折號的長度。油漆的strokeWidth控制了破折號的厚度。注意:這個patheeffect只影響畫風設置為STROKE或FILL_AND_STROKE的繪圖。如果繪圖是用style == FILL完成的,它將被忽略。
參數(shù)1:間隔-開和關距離的數(shù)組
參數(shù)2:相位偏移到間隔數(shù)組中
4、CornerPathEffect()通過將線段之間的任何銳角替換為指定半徑的圓角,轉換所繪制的幾何圖形(STROKE或FILL樣式)。
參數(shù):半徑-線段之間的圓角。
5、ComposePathEffect() 構造一個PathEffect,其效果是首先應用內(nèi)部效果和外部PathEffect(例如outer(inner(path)))。
6、PathDashPathEffect()用指定的形狀對所繪制的路徑進行沖壓。這只適用于當油漆樣式為STROKE或STROKE_AND_FILL時的繪圖。如果油漆的樣式是FILL,那么這個效果將被忽略。油漆的描邊寬度不會影響結果。
效果:
private fun pathEffect(canvas: Canvas?) {Paint().apply {color = Color.BLUEstrokeWidth = 5fstrokeJoin = Paint.Join.ROUNDstyle = Paint.Style.STROKEpathEffect = DiscretePathEffect(10f,20f)canvas?.drawPath(Path().apply {moveTo(0f,200f)lineTo(300f,100f)lineTo(200f,200f)lineTo(0f,200f)},this)pathEffect = DashPathEffect(FloatArray(2).apply {this[0] = 10fthis[1] = 5f },10f)canvas?.drawPath(Path().apply {moveTo(250f,200f)lineTo(300f,100f)lineTo(500f,200f)lineTo(250f,200f)},this)pathEffect = SumPathEffect( DiscretePathEffect(10f,20f),DashPathEffect(FloatArray(2).apply {this[0] = 10fthis[1] = 5f },10f))canvas?.drawPath(Path().apply {moveTo(0F,400f)lineTo(200f,300f)lineTo(100f,400f)lineTo(0F,400f)},this)pathEffect = CornerPathEffect(15f)canvas?.drawPath(Path().apply {moveTo(250f,400f)lineTo(300f,300f)lineTo(500f,400f)lineTo(250f,400f)},this)pathEffect = ComposePathEffect( DiscretePathEffect(10f,20f),DashPathEffect(FloatArray(2).apply {this[0] = 10fthis[1] = 5f },10f))canvas?.drawPath(Path().apply {moveTo(550f,400f)lineTo(600f,300f)lineTo(800f,400f)lineTo(550f,400f)},this)pathEffect = PathDashPathEffect( Path().apply {moveTo(0f,8f)lineTo(3f,4f)lineTo(8f,8f)lineTo(0f,8f)},5f,10f,PathDashPathEffect.Style.TRANSLATE)canvas?.drawPath(Path().apply {moveTo(0f,700f)lineTo(300f,500f)lineTo(700f,700f)lineTo(0f,700f)},this)}}
4、maskFilter
1、BlurMaskFilter
這需要一個蒙版,并通過指定的半徑模糊其邊緣。是否包含原始蒙版,以及模糊是在原始蒙版的邊界外、內(nèi)還是跨界,都由blur enum控制。
2、EmbossMaskFilter
創(chuàng)建一個浮雕蒙版過濾器
已經(jīng)被棄用 這個子類不受支持,不應該被實例化。
private fun maskFilter(canvas: Canvas?) {Paint().apply {color = Color.REDmaskFilter = BlurMaskFilter(20F,BlurMaskFilter.Blur.SOLID)val b0 = BitmapFactory.decodeResource(context.resources, R.mipmap.aa)canvas?.drawBitmap(b0,30f,800f,this)maskFilter = EmbossMaskFilter(listOf<Float>(30f,30f,30f).toFloatArray(),0.2F,60F,10F)val b = BitmapFactory.decodeResource(context.resources, R.mipmap.aa)canvas?.drawBitmap(b,30f,800f+b0.height,this)}}
5、colorFilter
ColorFilter主要用來處理顏色,這里將講解它的三個子類,ColorMatrixColorFilter,
LightingColorFilter以及PorterDuffColorFilter。
1、ColorMatrixColorFilte 是一種通過4x5顏色矩陣轉換顏色的顏色過濾器。這個濾鏡可以用來改變像素的飽和度,從YUV轉換為RGB等。
參見:ColorMatrix
RGB和Alpha的終值計算方法如下: Red通道終值= a[0] * srcR + a[1] * srcG + a[2] * srcB +
a[3] * srcA + a[4] Green通道終值= a[5] * srcR + a[6] * srcG + a[7] * srcB
- a[8] * srcA + a[9] Blue通道終值= a[10] * srcR + a[11] * srcG + a[12] * srcB + a[13] * srcA + a[14] Alpha通道終值= a[15]*srcR+a[16]*srcG + a[17] *
srcB + a[18] * srcA + a[19]備注: srcR為原圖Red通道值,srcG為原圖Green通道值,srcB為原圖Blue通道值,srcA為原圖Alpha通道值。
每個通道的源值和終值都在0到255的范圍內(nèi)。即使計算結果大于255或小于0,值都將被限制在0到255的范圍內(nèi)。
2、LightingColorFilter是一個顏色濾鏡,可以用來模擬簡單的照明效果。LightingColorFilter由兩個參數(shù)定義,一個用于將源顏色相乘(稱為colorMultiply),另一個用于向源顏色添加(稱為colorAdd)。alpha通道不受此顏色濾鏡的影響。給定一個源顏色RGB,得到的R’ g ’ b '顏色計算如下:
R’ = R * colorMultiply.R + colorAdd.R
G’ = G * colorMultiply.G + colorAdd.G
B’ = B * colorMultiply.B + colorAdd.B
效果:
3、PorterDuffColorFilter 是一種顏色濾鏡,可用于使用單一顏色和特定波特-達夫復合模式對源像素進行著色。
效果:
private fun colorFilter(canvas: Canvas?) {//1、ColorMatrixColorFilterPaint().apply {val MATRIX = floatArrayOf(0.3f, 0f, 0f, 0f, 0f,0f, 0.5f, 0f, 0f, 0f,0f, 0f, 0.5f, 0f, 0f,0f, 0f, 0f, 1f, 0f)val bitmap = BitmapFactory.decodeResource(context.resources, R.mipmap.aa)canvas?.drawBitmap(bitmap, 100F, 0F, this);val filter = ColorMatrixColorFilter(MATRIX)colorFilter = filtercanvas?.drawBitmap(bitmap, 100F, 500F, this)/*方式1*/val colorMatrix = ColorMatrix()colorMatrix.setSaturation(0f)colorFilter = ColorMatrixColorFilter(colorMatrix)canvas?.drawBitmap(bitmap, 100F, 1000F, this)}//2、LightingColorFilterPaint().apply {val bitmap = BitmapFactory.decodeResource(context.resources, R.mipmap.aa)canvas?.drawBitmap(bitmap, 100F, 0F, this);val filter = LightingColorFilter(100,0)colorFilter = filtercanvas?.drawBitmap(bitmap, 100F, 500F, this)/*方式1*/colorFilter = LightingColorFilter(100,100)canvas?.drawBitmap(bitmap, 100F, 1000F, this)}//3、PorterDuffColorFilter 是一種顏色濾鏡,可用于使用單一顏色和特定波特-達夫復合模式對源像素進行著色。Paint().apply {val bitmap = BitmapFactory.decodeResource(context.resources, R.mipmap.aa)canvas?.drawBitmap(bitmap, 100F, 0F, this);val filter = PorterDuffColorFilter(Color.YELLOW,PorterDuff.Mode.DARKEN)colorFilter = filtercanvas?.drawBitmap(bitmap, 100F, 500F, this)}}
6、xfermode
1、PorterDuffXfermode
專門實現(xiàn)Paint的轉移模式。參考PorterDuff的文檔。關于可用的alpha合成和混合模式的更多信息的模式enum。
效果
例子
private fun xFerMode(canvas: Canvas) {/*** 創(chuàng)建一個新的層layer*/canvas.saveLayer(RectF(0f, 0f, canvas.width.toFloat(), canvas.height.toFloat()),Paint())Paint().apply {strokeWidth=5fstrokeCap = Paint.Cap.ROUNDstrokeJoin = Paint.Join.ROUNDstyle = Paint.Style.FILL_AND_STROKEcolor = Color.GREEN/*** 步驟1、繪制一個底層圓形圖形*/val radius = 100fval top = 1200fval scr = Bitmap.createBitmap(radius.toInt()*2, radius.toInt()*2,Bitmap.Config.ARGB_8888)Canvas(scr).apply {drawBitmap(scr,0f,0f,Paint())drawCircle(radius,radius,radius,Paint().apply {color = Color.RED})}canvas?.drawBitmap(scr,0f,top,Paint())/*** 1、PorterDuffXfermode*/xfermode = PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)/*** 步驟2、繪制上層圖片*/val bit = BitmapFactory.decodeResource(context.resources,R.mipmap.aa)canvas?.drawBitmap(bit,radius,top+radius,this)}}