gpt4 book ai didi

android - 如何检查 Canvas 功能是否支持给定设备上的硬件加速?

转载 作者:搜寻专家 更新时间:2023-11-01 09:08:03 25 4
gpt4 key购买 nike

我有一个自定义 AdapterView,它覆盖 drawChild 以在 Canvas 动画期间剪辑 subview 。

这似乎在 honeycomb 上运行良好,但一旦加载到 Android 4.0 平板电脑上就会死机。我怀疑这是因为 Android 4.0 默认打开硬件加速,而我使用的一种或多种 Canvas 方法在我使用的特定设备上不支持硬件加速(带有 ICS 4.0.3 的 Acer A100)

这是我的 drawChild 方法(来 self 的 NinjaMenu.java 类):

@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
final int top = child.getTop();
final int left = child.getLeft();
Bitmap bitmap = child.getDrawingCache();
if (bitmap == null) {
child.setDrawingCacheEnabled(true);
child.buildDrawingCache();
bitmap = child.getDrawingCache();
}
if (mCutPath != null) {
// clip child views so that they partially show
// as menu is expanded
canvas.clipPath(mCutPath);
canvas.drawBitmap(bitmap, left, top, null);
}

return false;
}

mCutPath 是在代码其他地方创建的 Path 对象(对这个问题不重要)。

这是 AdapterView 尝试绘制 subview 时发生的异常:

FATAL EXCEPTION: main
java.lang.UnsupportedOperationException
at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:408)
at com.phunware.funimation.android.views.NinjaMenu.drawChild(NinjaMenu.java:529)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.draw(View.java:10986)
at android.view.View.getDisplayList(View.java:10422)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10420)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.draw(View.java:10986)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at android.view.View.getDisplayList(View.java:10422)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10420)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10420)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10420)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.draw(View.java:10986)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2152)
at android.view.View.getDisplayList(View.java:10422)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:852)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:1910)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

除了完全禁用硬件加速之外,有没有办法检查给定的 Canvas 函数是否支持硬件加速以及是否不将其关闭?

最佳答案

坏消息:不,没有办法以编程方式检查给定函数是否支持硬件加速。

好消息:您不是第一个遇到这个问题的人,而且有问题的功能(以及许多其他关于硬件加速的好消息)都有很好的记录here :

  • Canvas
    • 剪辑路径
    • 剪辑区域
    • 画图
    • 画点数
    • 绘制位置文本
    • 绘制文本路径
    • 绘制顶点
  • 绘画
    • 设置线性文本
    • 设置掩码过滤器
    • 设置光栅化器

请注意,该文档还列出了一些具有不同 行为的函数。

一个可靠的解决方法是识别代码中有问题的操作,将它们绘制到位图,然后将位图 blit 到加速 Canvas 。

关于android - 如何检查 Canvas 功能是否支持给定设备上的硬件加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418483/

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