android - LAYER_TYPE_SOFTWARE 在一段时间内不会在某些设备上禁用硬件加速

标签 android view hardware-acceleration

我使用 clipPath 从 canvas 进行圆形剪辑,然后驱动:

@Override
protected void onDraw(Canvas canvas) 
{   
    float radius = ((float) getWidth()) / 2;
    clipPath.reset();
    clipPath.addCircle(radius, radius, radius, Path.Direction.CW);
    canvas.clipPath(clipPath);
    super.onDraw(canvas);
}

当然,我在构造函数和 XML 中为此 View 设置了 View.LAYER_TYPE_SOFTWARE。

但在某些设备上(Android 3):

LENOVO K1
acer A501
samsung GT-P6200
ZTE V9S

当我尝试绘制剪裁的 Canvas 时抛出异常:

java.lang.UnsupportedOperationException
at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:303)
at com.myapp.ui.RoundedCornerImageView.onDraw(RoundedCornerImageView.java:35)
at android.view.View.draw(View.java:9292)
at android.view.View.getDisplayList(View.java:8755)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.drawChild(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
at android.view.View.getDisplayList(View.java:8753)
at android.view.ViewGroup.drawChild(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
at android.widget.AbsListView.dispatchDraw(AbsListView.java:2029)
at android.view.View.draw(View.java:9399)
at android.widget.AbsListView.draw(AbsListView.java:3315)
at android.view.View.getDisplayList(View.java:8755)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2296)
at android.view.View.getDisplayList(View.java:8719)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:691)
at android.view.ViewRoot.draw(ViewRoot.java:1624)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1440)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2070)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4143)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
at dalvik.system.NativeStart.main(Native Method)

有趣的是,应用程序不是立即崩溃,而是在一段时间后崩溃。对于上面的堆栈,开始时间是 2013-03-31 16:04:04,崩溃时间是 2013-03-31 16:18:47。虽然RoundedCornerImageView是显示在MainActivity的!

最佳答案

我发现了这个错误:http://code.google.com/p/android/issues/detail?id=20474

它仅在 4.1 (API 16) 中修复。

我决定只为 API 16 及更高版本打开硬件加速

在 list 中:

android:hardwareAccelerated="@bool/hw_acceleration"

在 values/constants.xml 中:

<bool name="hw_acceleration">false</bool>

在 values-16/constants.xml 中:

<bool name="hw_acceleration">true</bool>

我希望,这会成功!

关于android - LAYER_TYPE_SOFTWARE 在一段时间内不会在某些设备上禁用硬件加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15826769/

相关文章:

Android - 免费提供的自定义应用程序主题

java - 数据绑定(bind);查看标签不正确,Android

windows - 在 Windows 上捕获和显示实时摄像头内容

Android SSL 错误握手失败

Android 倾斜补偿指南针

view - 将终止按钮添加到 Eclipse 控制台

opencv - 使用 ffmpeg、OpenCV 的硬件加速 h264 解码

java - JUnit 调用一个调用另一个方法的方法返回 nullPointerException

SQL - 将两个表的内容合并到一个表/ View 中