Android-在Android Pie(API 28)中,RadialGradient绘制的是一个矩形而不是圆形

Android-在Android Pie(API 28)中,RadialGradient绘制的是一个矩形而不是圆形,android,android-canvas,paint,android-9.0-pie,porter-duff,Android,Android Canvas,Paint,Android 9.0 Pie,Porter Duff,我试图用背景图像和前景图像模拟火炬视图。它在API 27及以下版本上运行良好,但在API 28上绘制一个矩形 你知道为什么Android Pie不起作用吗 API 27及以下版本的屏幕截图 API 28的屏幕截图 火炬视图类 class TorchView : View, OnTouchListener { var mBitmapBackground: Bitmap? = null var mBitmapForeground: Bitmap? = null var

我试图用背景图像和前景图像模拟火炬视图。它在API 27及以下版本上运行良好,但在API 28上绘制一个矩形

你知道为什么Android Pie不起作用吗

API 27及以下版本的屏幕截图

API 28的屏幕截图

火炬视图类

class TorchView : View, OnTouchListener { var mBitmapBackground: Bitmap? = null var mBitmapForeground: Bitmap? = null var mMask: Bitmap? = null private var mPosX = 0f private var mPosY = 0f private lateinit var paintMask: Paint private lateinit var paintBackground: Paint private lateinit var paintForeground: Paint private var radius = 150 constructor(context: Context) : super(context) { init() } constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { init() } fun initBitmaps(bitmapBackground: Bitmap, bitmapForeground: Bitmap, radius: Int){ this.radius = radius mBitmapBackground = bitmapBackground mBitmapForeground = bitmapForeground mMask = makeRadGrad() mPosX = (bitmapBackground.width/2 - radius).toFloat() mPosY = (bitmapBackground.height/2 - radius).toFloat() invalidate() } fun init() { paintBackground = Paint() paintMask = Paint() paintMask.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR) paintForeground = Paint() paintForeground.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OVER) isFocusable = true isFocusableInTouchMode = true this.setOnTouchListener(this) } public override fun onDraw(canvas: Canvas) { super.onDraw(canvas) val mask = mMask val bitmapForeground = mBitmapBackground val bitmapBackground = mBitmapForeground if(mask != null && bitmapForeground != null && bitmapBackground != null){ canvas.save() canvas.drawBitmap(bitmapBackground, 0f, 0f, paintBackground) canvas.drawBitmap(mask, mPosX, mPosY, paintMask) canvas.drawBitmap(bitmapForeground, 0f, 0f, paintForeground) canvas.restore() } } private fun makeRadGrad(): Bitmap { val gradient = RadialGradient( radius.toFloat(), radius.toFloat(), radius.toFloat(), -0xff0100, 0x00000000, android.graphics.Shader.TileMode.CLAMP ) val p = Paint() p.isDither = true p.shader = gradient val bitmap = Bitmap.createBitmap(radius*2, radius*2, Config.ARGB_8888) val c = Canvas(bitmap) c.drawCircle(radius.toFloat(), radius.toFloat(), radius.toFloat(), p) return bitmap } override fun onTouch(v: View?, event: MotionEvent): Boolean { mPosX = event.x - radius mPosY = event.y - radius invalidate() return true } } 类TorchView:View,OnTouchListener{ var mBitmapBackground:位图?=null var mBitmapForeground:位图?=null var mMask:位图?=null 专用变量mPosX=0f 专用变量mPosY=0f 私有lateinit var paintMask:Paint 私有lateinit var paintBackground:Paint 私有lateinit var Paint前台:绘制 专用var半径=150 构造函数(上下文:上下文):超级(上下文){ init() } 构造函数(context:context,attrs:AttributeSet):super(context,attrs){ init() } 趣味位图(位图背景:位图,位图前景:位图,半径:Int){ 这个半径=半径 MbitMacBackground=位图背景 mBitmapForeground=位图前景 mMask=makeRadGrad() mPosX=(bitmapBackground.width/2-radius).toFloat() mPosY=(bitmapBackground.height/2-radius).toFloat() 使无效 } fun init(){ paintBackground=Paint() paintMask=Paint() paintMask.xfermode=PorterDuffXfermode(PorterDuff.Mode.CLEAR) paintForeground=Paint() paintForeground.xfermode=PorterDuffXfermode(PorterDuff.Mode.DST_结束) isFocusable=true isFocusableInTouchMode=true this.setOnTouchListener(this) } 公共覆盖图(画布:画布){ super.onDraw(画布) val mask=mMask val bitmapForeground=mbitmappbackground val bitmapBackground=mBitmapForeground 如果(掩码!=null&&bitmapForeground!=null&&bitmapBackground!=null){ canvas.save() canvas.drawBitmap(位图背景、0f、0f、paintBackground) canvas.drawBitmap(mask、mPosX、mPosY、paintMask) canvas.drawBitmap(位图前景、0f、0f、画图前景) canvas.restore() } } private fun makeRadGrad():位图{ 瓦尔梯度=径向梯度( radius.toFloat(),radius.toFloat(),radius.toFloat(),-0xff0100, 0x00000000,android.graphics.Shader.TileMode.CLAMP ) val p=油漆() p、 isDither=true p、 着色器=渐变 val bitmap=bitmap.createBitmap(radius*2,radius*2,Config.ARGB_8888) val c=画布(位图) c、 绘图圆(半径.toFloat(),半径.toFloat(),半径.toFloat(),p) 返回位图 } 重写fun onTouch(v:View?,事件:MotionEvent):布尔值{ mPosX=事件.x-半径 mPosY=事件y-半径 使无效 返回真值 } } 根据

PorterDuff在Android API 28中被弃用

您应该将PorterDuff替换为

也许你应该在Android API 28上做一些兼容的工作检查一下

试试这个

 public override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    val mask = mMask
    val bitmapForeground = mBitmapBackground
    val bitmapBackground = mBitmapForeground
    if(mask != null && bitmapForeground != null && bitmapBackground != null){
        canvas.save()
        canvas.drawBitmap(bitmapBackground, 0f, 0f, paintBackground)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            makeRadGradP(canvas, bitmapForeground)
        } else {
            canvas.drawBitmap(mask, mPosX, mPosY, paintMask)
            canvas.drawBitmap(bitmapForeground, 0f, 0f, paintForeground)
         }
        canvas.restore()
    }
}

private fun makeRadGradP(canvas: Canvas, bm: Bitmap) {
        val paint = Paint()
        paint.style = Paint.Style.FILL
        val shader = BitmapShader(bm, TileMode.CLAMP, TileMode.CLAMP)
        paint.shader = shader
        val corners = Path()
        corners.addCircle(mPosX + radius, mPosY + radius, radius.toFloat(), Path.Direction.CW)
        canvas.drawPath(corners, paint)

        val gradient = RadialGradient(
                mPosX + radius, mPosY + radius, radius.toFloat(), 0x00000000,
                Color.parseColor("#df000000"), TileMode.CLAMP
        )
        val p = Paint()
        p.isDither = true
        p.shader = gradient
        canvas.drawCircle(mPosX + radius, mPosY + radius, radius.toFloat(), p)
 }

Android API 28不是Q,Q还在预览中:/噢,好像我犯了个错误。非常感谢,这正是我需要的。感谢您链接问题跟踪器。