Masked ImageView在Android 5上有黑色背景

时间:2015-01-22 16:25:19

标签: android android-canvas android-imageview

我重写了ImageView的onDraw方法,将半径应用于图像并且它曾经工作正常,但它在Android 5上有一个小问题。事实上它适用于Galaxy S II(4.1)和Nexus 4( 4.4.4),但不是Nexus 5(5.0.1)。

在Nexus 5上,圆形图像后面有一个黑色背景,我没有摆脱它!例如,当我转动手机方向时,黑色背景消失了。

class Avatar extends ImageView
{
    private RectF rectangle = new RectF()

    private Paint paint1 = new Paint( Paint.ANTI_ALIAS_FLAG )

    private Paint paint2 = new Paint()

    public Avatar()
    {
         paint2.setXfermode( new PorterDuffXfermode( Mode.SRC_IN ) )
    }

    override void onDraw( Canvas canvas )
    {
        final Drawable drawable = getDrawable

        if( drawable == null )
        {
            super.onDraw( canvas )
            return
        }

        rectangle.set( 0, 0, canvas.getWidth(), canvas.getHeight() )
        int restore = canvas.saveLayer( rectangle, null, Canvas.ALL_SAVE_FLAG )
        canvas.drawRoundRect( rectangle, 50, 50, paint1 )
        canvas.saveLayer( rectangle, paint2, Canvas.ALL_SAVE_FLAG )
        super.onDraw( canvas )
        canvas.restoreToCount( restore )
    }
}

请忽略语法错误或无效的构造函数,因为我从Scala中松散地翻译了

1 个答案:

答案 0 :(得分:0)

问题是由硬件加速创建的。我正在显示一个占位符头像,它是从SVG渲染的,需要我禁用硬件加速。然后,当实际位图完成加载时,我用位图替换了SVG,但没有重新开启硬件加速。

我现在能够摆脱丑陋的黑色背景。但是,当硬件加速被禁用时,我仍然不明白为什么代码在Nexus 5上失败,而它在其他设备上运行得非常好!