2012-04-16 2 views
8

내 앱에서 하드웨어 가속을 사용할 수있게 설정되었지만 뇌졸중 캡 및 기타 문제가있어 내보기에서 해당 기능을 사용 중지했습니다.보기에서 하드웨어 가속을 사용하지 않는 GLES20Canvas.clipPath에서 UnsupportedOperationException이 발생했습니다.

지금은 구글이 스택 추적 충돌 오류 콘솔 플레이 받고 있어요 : 나는의 AndroidManifest.xml에 android:hardwareAccelerated="true"를 지정

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

합니다. 하지만 내 사용자 지정보기의 생성자에서 내가 특별히 사용할 하드웨어 가속 : 호환성

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

는 불행하게도 충돌 오류 콘솔은 안드로이드 OS 버전이나 장치에 대한 정보를 공개하지 않습니다.

어떤 아이디어가 진행되고 있을까요?

답변

6

LAYER_TYPE_SOFTWARE가 설정된 경우에도 하드웨어 가속을 사용하여 여전히보기가 그려지는 알려진 문제가 있습니다. 자세한 사항은 문제가있는 코드를 건너 뛰려면 두 가지

  1. 사용 Canvas.isHardwareAccelerated()을 할 수있는 해결 방법으로

    here이다.

  2. 비트 맵에 문제가되는 부분을 그리고 하드웨어 가속 뷰에 canvas.drawBitmap()으로 그립니다.
관련 문제