2012-04-16 19 views
8

L'accelerazione hardware è abilitata nella mia app ma l'ho disabilitata per una delle mie visualizzazioni perché ho avuto problemi con ictus cap e altre cose.UnsupportedOperationException in GLES20Canvas.clipPath con accelerazione hardware disabilitata sulla vista

Ora sto ottenendo questo stack trace nel Google Play Crash console Errori:

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

Ho specificato android:hardwareAccelerated="true" in AndroidManifest.xml. Ma ho espressamente disattivato l'accelerazione hardware nel costruttore della mia vista personalizzata:

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

Con compatibilità essere questo:

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

Purtroppo la console degli errori Crash non rivela informazioni sulla versione del sistema operativo Android o dispositivo.

Qualche idea su cosa potrebbe succedere?

risposta

6

C'è un problema noto in cui una vista viene ancora disegnata utilizzando l'accelerazione hardware anche se LAYER_TYPE_SOFTWARE è stato impostato. I dettagli sono here

Per risolvere il problema si possono fare due cose

  1. uso Canvas.isHardwareAccelerated() di saltare il codice problematico.
  2. disegnare le cose problematiche in un bitmap e disegnare questo con canvas.drawBitmap() sulla vista accelerata hardware.
Problemi correlati