gpt4 book ai didi

android - View 中禁用硬件加速的 GLES20Canvas.clipPath 中的 UnsupportedOperationException

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:53:30 25 4
gpt4 key购买 nike

我在我的应用程序中启用了硬件加速,但我在我的一个 View 中禁用了它,因为我遇到了笔划帽和其他问题。

现在我在 Google Play 崩溃错误控制台中得到了这个堆栈跟踪:

java.lang.UnsupportedOperationException
at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:287)
at com.myapp.MyCustomView.onDraw(SourceFile:288)
at android.view.View.draw(View.java:9310)
at android.view.View.getDisplayList(View.java:8773)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2298)
...
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:609)
at android.view.ViewRoot.draw(ViewRoot.java:1634)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1450)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2094)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4123)
...

我在 AndroidManifest.xml 中指定了 android:hardwareAccelerated="true"。但是我在自定义 View 的构造函数中特别禁用了硬件加速:

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);

// ... code omitted

// disable acceleration because Paint.setStrokeCap(Cap.ROUND) is not working otherwise
Compatibility.disableHardwareAcceleration(this);
}

兼容性是这样的:

public class Compatibility {
// View.setLayerType() was introduced in Honeycomb
private static Method setLayerTypeMethod = getMethod(View.class, "setLayerType", int.class,
Paint.class);

private static Method getMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
try {
return clazz.getMethod(name, parameterTypes);
}
catch (NoSuchMethodException e) {
return null;
}
}

private Compatibility() {
}

public static void disableHardwareAcceleration(View view) {
try {
if (setLayerTypeMethod != null) {
int layerType = 1; // View.LAYER_TYPE_SOFTWARE
setLayerTypeMethod.invoke(view, layerType, null);
}
}
catch (Exception ignored) {
}
}
}

遗憾的是,崩溃错误控制台不会显示有关 Android 操作系统版本或设备的信息。

任何想法可能会发生什么?

最佳答案

有一个已知问题,即使设置了 LAYER_TYPE_SOFTWARE, View 仍然使用硬件加速绘制。详情为here

作为解决方法,您可以做两件事

  1. 使用Canvas.isHardwareAccelerated()跳过有问题的代码。
  2. 将有问题的内容绘制到位图中,然后使用 canvas.drawBitmap() 将其绘制到硬件加速 View 上。

关于android - View 中禁用硬件加速的 GLES20Canvas.clipPath 中的 UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com