赞
踩
1.个人理解 使用PorterDuffXfermode的前提是 需要新的画布Canvas和 新的Bitmap 如 :new Canvas(bitmap)
然后再新画布上画东西(其实就相当于画在了bitmap上),然后在原来的画布上 画这个新的bitmap;
2.原来的画布需要设置 canvas.saveLayer(),这里的参数需要注意,不是一成不变的,需要根据你选择PorterDuffXfermode,模式去调整,比如我选择了 PorterDuff.Mode.DST,我需要把这个saveLayer()范围这个到 dst 对应的 画布位置
3.最好关闭硬件加速,不然效果对应不上
4.上面 1,2,3都设置了之后,你发现效果和官方demo的不一样,可能是 canvas.saveLayer()设置的不对,尝试设置一下SRC画布位置或者DST画布位置 又或者 SRC 画布 和 DST画布 的最大范围的位置
- import android.content.Context
- import android.graphics.*
- import android.util.AttributeSet
- import android.view.View
-
- class MyView2(context: Context, attrs: AttributeSet?) : View(context, attrs) {
- init {
- setLayerType(View.LAYER_TYPE_SOFTWARE, null);
- }
-
- val rectSize = 200f
- fun makeSrc(): Bitmap {
- val bitmap = Bitmap.createBitmap(rectSize.toInt()
- , rectSize.toInt(), Bitmap.Config.ARGB_8888)
- val c = Canvas(bitmap)
- val p = Paint().apply {
- style = Paint.Style.FILL
- color = Color.YELLOW
- }
- c.drawColor(Color.TRANSPARENT)
- c.drawRect(0f, 0f, bitmap.width.toFloat() - 50f, bitmap.height - 50f.toFloat(), p)
- return bitmap
- }
-
- fun makeDst(): Bitmap {
- val radius = rectSize / 2
- val bitmap = Bitmap.createBitmap(rectSize.toInt()
- , rectSize.toInt(), Bitmap.Config.ARGB_8888)
- val c = Canvas(bitmap)
- val p = Paint().apply {
- style = Paint.Style.FILL
- color = Color.BLUE
- }
- c.drawColor(Color.TRANSPARENT)
- c.drawCircle(radius, radius, radius, p)
- return bitmap
- }
-
-
- private val paint by lazy {
- Paint().apply {
- isAntiAlias = true
- color = Color.BLUE
- style = Paint.Style.FILL
- }
- }
-
- override fun onDraw(canvas: Canvas?) {
- canvas ?: return
- canvas.drawColor(Color.WHITE)
- paint.isFilterBitmap = false
- val sc = canvas.saveLayer(0f
- , 0f
- , 250f, 250f, null,
- Canvas.ALL_SAVE_FLAG)
- canvas.drawBitmap(makeDst()
- , 0f, 0f, paint)
- paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST)
- canvas.drawBitmap(makeSrc(), 50f, 50f, paint)
- paint.xfermode = null
- canvas.restoreToCount(sc)
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。