2

我有一个自定义 AdapterView 覆盖 drawChild 以在画布动画期间剪辑子视图。

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

这是我的 drawChild 方法(来自我的 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 尝试绘制孩子时发生的异常:

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)

除了完全禁用硬件加速之外,有没有办法检查给定的画布功能是否支持硬件加速以及是否不关闭它?

4

1 回答 1

3

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

好消息:你不是第一个遇到这个问题的人,有问题的功能(以及许多其他关于硬件加速的好东西)都很好地记录在这里

  • 帆布
    • 剪辑路径
    • 剪辑区域
    • 画图
    • 绘制点
    • drawPosText
    • drawTextOnPath
    • 绘制顶点
    • 设置线性文本
    • 设置掩码过滤器
    • 设置光栅化器

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

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

于 2012-05-02T19:03:10.743 回答