2012-04-16 55 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()將其繪製到硬件加速視圖上。