setShadowLayer在Android API中的差异

39

我为我的应用程序开发了一个自定义视图组件,但我在将阴影添加到圆形中遇到了困难。

这是我扩展View类的代码:

public class ChartView extends View {


    public ChartView(Context context, AttributeSet attributeSet){
        super(context, attributeSet);
        init();


    }
    Paint paint;
    public void init(){
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.FILL);
        paint.setShadowLayer(30, 0, 0, Color.RED);

    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawCircle(getWidth()/2, getHeight()/2,50, paint);
    }
}

然而,我注意到根据API的不同,阴影层会有很大的影响。

这是使用以下API的输出结果:

<uses-sdk android:targetSdkVersion="13"/>

enter image description here

这里是带有输出结果的内容

<uses-sdk android:targetSdkVersion="14"/> //Higher target API yields the same output.

enter image description here

你有什么办法可以克服这种不希望出现的行为吗?

1个回答

77

setShadowLayer()仅在硬件加速开启时对文本支持。当targetSdk=14或更高版本时,默认是开启硬件加速的。一个简单的解决方法是将您的View放置在软件图层中:myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)


谢谢,这个立刻就起作用了。我在安卓文档中没有看到过这个,这可能会帮助未来的人们。 - Al_th
5
它在这里有记录:http://developer.android.com/guide/topics/graphics/hardware-accel.html :)) - Romain Guy
3
谢谢提供额外的信息。我正在查看Canvas文档,这是我的疏忽! - Al_th
我使用Path.offset()。我在这里写下了我的问题:https://dev59.com/1YXca4cB1Zd3GeqPP_d4。现在我意识到,如果我使用myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null),它在每个设备上都可以正常工作。我能否给出一些条件,在不关闭它的情况下。我的意思是它在某些设备上运行良好。也许像这样:只有当(android.os.Build.VERSION.SDK_INT <= 14)时才关闭硬件加速模式。 - Tomi
谢谢,我发现Android 6.0中硬件加速已关闭。 - BinqiangSun
1
为什么使用LAYER_TYPE_SOFTWARE绘制的阴影比视图硬件加速时要暗得多?(API 26) - User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接