2012-04-16 7 views
8

Ich habe Hardwarebeschleunigung in meiner App aktiviert, aber ich habe es für eine meiner Ansichten deaktiviert, weil ich Probleme mit Strichbegrenzungen und anderen Dingen hatte.Nicht unterstützteOperationException in GLES20Canvas.clipPath mit Hardwarebeschleunigung in Sicht deaktiviert

Jetzt bin ich immer diese Stack-Trace in der Google-Crash-Fehler-Konsole Spielen:

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) 
... 

I android:hardwareAccelerated="true" in AndroidManifest.xml angegeben haben. Aber ich speziell deaktiviert Hardware-Beschleunigung im Konstruktor meiner benutzerdefinierten Ansicht:

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); 
    } 

Mit Kompatibilität wobei dies:

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) { 
       } 
     } 
} 

Leider ist die Crash-Fehler-Konsole nicht offenbaren Informationen über die Android OS-Version oder Gerät.

Irgendwelche Ideen, was passieren könnte?

Antwort

6

Es gibt ein bekanntes Problem, bei dem eine Ansicht immer noch mit der Hardwarebeschleunigung gezeichnet wird, selbst wenn LAYER_TYPE_SOFTWARE festgelegt wurde. Details sind here

Als Abhilfe können Sie zwei Dinge tun können

  1. Verwendung Canvas.isHardwareAccelerated() den problematischen Code zu überspringen.
  2. zeichnen Sie die problematischen Sachen in eine Bitmap und zeichnen Sie diese mit canvas.drawBitmap() auf die hardwarebeschleunigte Ansicht.
Verwandte Themen