2012-04-16 37 views
8

Tôi đã bật tăng tốc phần cứng trong ứng dụng của mình nhưng tôi đã vô hiệu hóa nó vì một trong các quan điểm của tôi vì tôi gặp vấn đề với mũ đột quỵ và những thứ khác.UnsupportedOperationException trong GLES20Canvas.clipPath với khả năng tăng tốc phần cứng bị vô hiệu hóa trên màn hình

Bây giờ tôi nhận được đống này dấu vết trong Google Play Sụp đổ lỗi giao diện điều khiển:

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

tôi đã xác định android:hardwareAccelerated="true" trong AndroidManifest.xml. Nhưng tôi đặc biệt tàn tật tăng tốc phần cứng trong constructor của giao diện tùy chỉnh của tôi:

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

Với khả năng tương thích được điều này:

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

Thật không may là lỗi sụp đổ console không tiết lộ thông tin về phiên bản hệ điều hành Android hoặc thiết bị.

Bất kỳ ý tưởng nào có thể xảy ra?

Trả lời

6

Có một vấn đề đã biết khi chế độ xem vẫn được vẽ bằng tăng tốc phần cứng ngay cả khi LAYER_TYPE_SOFTWARE được đặt. Cụ thể here

Là một workaround bạn có thể làm hai việc

  1. sử dụng Canvas.isHardwareAccelerated() để bỏ qua đoạn code có vấn đề.
  2. vẽ nội dung có vấn đề vào bitmap và vẽ hình này bằng canvas.drawBitmap() vào chế độ xem tăng tốc phần cứng.
Các vấn đề liên quan