2012-04-16 57 views
8

我的应用程序中启用了硬件加速,但我已禁用它的一个我的意见,因为我有笔画上限和其他问题的问题。GLES20Canvas.clipPath中的UnsupportedOperationException在硬件加速被禁用的情况下

现在我得到的谷歌该堆栈跟踪播放机错误控制台:

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"。但在我的自定义视图的构造我专门禁用硬件加速:

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操作系统版本或设备信息。

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

回答

6

即使设置了LAYER_TYPE_SOFTWARE,仍然存在使用硬件加速绘制视图的已知问题。详情here

作为一种变通方法,您可以做两件事

  1. 使用Canvas.isHardwareAccelerated()跳过有问题的代码。
  2. 将有问题的东西绘制到位图中,并使用canvas.drawBitmap()将其绘制到硬件加速视图上。