Android关闭硬件加速对PorterDuffXfermode的影响
跑的版本minSdk=33
编译SDK=34
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
class MyView : AppCompatImageView {
private var mBmp: Bitmap? = null
private val H = 400f
private val W = 400f
private var closeGPU = false //true 关闭硬件加速。
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
if (closeGPU) {
setLayerType(LAYER_TYPE_SOFTWARE, null)
}
mBmp = Bitmap.createBitmap(W.toInt(), H.toInt(), Bitmap.Config.ARGB_8888)
setImageBitmap(mBmp)
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val paint = Paint()
circleTarget(canvas, paint)
rectSource(canvas, paint)
}
private fun circleTarget(c: Canvas, paint: Paint) {
paint.style = Paint.Style.FILL
paint.isAntiAlias = true
paint.color = Color.RED
val radius = W / 2 // 或者 H/2 ,因为是正方形。
c.drawCircle(W / 2, H / 2, radius, paint)
}
private fun rectSource(c: Canvas, paint: Paint) {
paint.style = Paint.Style.FILL
paint.isAntiAlias = true
paint.color = Color.BLUE
val mode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
paint.xfermode = mode
val left: Float = W / 2
val top: Float = H / 2
val right: Float = W
val bottom: Float = H
c.drawRect(left, top, right, bottom, paint)
}
}
没有关闭硬件加速,closeGPU=false:
关闭硬件加速后,closeGPU=true:
具体到PorterDuffXfermode,关闭硬件加速,跑出来的结果符合预期。