当前位置:   article > 正文

关于PorterDuffXfermode的使用

porterduffxfermode

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画布 的最大范围的位置

 

  1. import android.content.Context
  2. import android.graphics.*
  3. import android.util.AttributeSet
  4. import android.view.View
  5. class MyView2(context: Context, attrs: AttributeSet?) : View(context, attrs) {
  6. init {
  7. setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  8. }
  9. val rectSize = 200f
  10. fun makeSrc(): Bitmap {
  11. val bitmap = Bitmap.createBitmap(rectSize.toInt()
  12. , rectSize.toInt(), Bitmap.Config.ARGB_8888)
  13. val c = Canvas(bitmap)
  14. val p = Paint().apply {
  15. style = Paint.Style.FILL
  16. color = Color.YELLOW
  17. }
  18. c.drawColor(Color.TRANSPARENT)
  19. c.drawRect(0f, 0f, bitmap.width.toFloat() - 50f, bitmap.height - 50f.toFloat(), p)
  20. return bitmap
  21. }
  22. fun makeDst(): Bitmap {
  23. val radius = rectSize / 2
  24. val bitmap = Bitmap.createBitmap(rectSize.toInt()
  25. , rectSize.toInt(), Bitmap.Config.ARGB_8888)
  26. val c = Canvas(bitmap)
  27. val p = Paint().apply {
  28. style = Paint.Style.FILL
  29. color = Color.BLUE
  30. }
  31. c.drawColor(Color.TRANSPARENT)
  32. c.drawCircle(radius, radius, radius, p)
  33. return bitmap
  34. }
  35. private val paint by lazy {
  36. Paint().apply {
  37. isAntiAlias = true
  38. color = Color.BLUE
  39. style = Paint.Style.FILL
  40. }
  41. }
  42. override fun onDraw(canvas: Canvas?) {
  43. canvas ?: return
  44. canvas.drawColor(Color.WHITE)
  45. paint.isFilterBitmap = false
  46. val sc = canvas.saveLayer(0f
  47. , 0f
  48. , 250f, 250f, null,
  49. Canvas.ALL_SAVE_FLAG)
  50. canvas.drawBitmap(makeDst()
  51. , 0f, 0f, paint)
  52. paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST)
  53. canvas.drawBitmap(makeSrc(), 50f, 50f, paint)
  54. paint.xfermode = null
  55. canvas.restoreToCount(sc)
  56. }
  57. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/332647
推荐阅读
相关标签
  

闽ICP备14008679号