2012-05-02 31 views
2

我有一個自定義AdapterView,它覆蓋了drawChild在畫布動畫期間剪輯子視圖。如何檢查畫布功能是否支持給定設備上的硬件加速?

這似乎在蜂窩上工作得很好,但一旦加載到Android 4.0平板電腦上就會死亡。我懷疑這是因爲Android 4.0會默認打開硬件加速,並且我正在使用的一種或多種畫布方法不支持使用特定設備上的硬件加速(Acer A100 with ICS 4.0.3)

此處是我drawChild方法(從我NinjaMenu.java類):

@Override 
    protected boolean drawChild(Canvas canvas, View child, long drawingTime) { 
     final int top = child.getTop(); 
     final int left = child.getLeft(); 
     Bitmap bitmap = child.getDrawingCache(); 
     if (bitmap == null) { 
      child.setDrawingCacheEnabled(true); 
      child.buildDrawingCache(); 
      bitmap = child.getDrawingCache(); 
     } 
     if (mCutPath != null) { 
      // clip child views so that they partially show 
      // as menu is expanded 
      canvas.clipPath(mCutPath); 
      canvas.drawBitmap(bitmap, left, top, null); 
     } 

     return false; 
    } 

mCutPath是在代碼(這個問題並不重要)別處創建一個Path對象。

這裏是儘快適配器視圖試圖得出一個孩子出現異常:

FATAL EXCEPTION: main 
java.lang.UnsupportedOperationException 
    at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:408) 
    at com.phunware.funimation.android.views.NinjaMenu.drawChild(NinjaMenu.java:529) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 
    at android.view.View.draw(View.java:10986) 
    at android.view.View.getDisplayList(View.java:10422) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:2850) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 
    at android.view.View.getDisplayList(View.java:10420) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:2850) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 
    at android.view.View.draw(View.java:10986) 
    at android.widget.FrameLayout.draw(FrameLayout.java:450) 
    at android.view.View.getDisplayList(View.java:10422) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:2850) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 
    at android.view.View.getDisplayList(View.java:10420) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:2850) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 
    at android.view.View.getDisplayList(View.java:10420) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:2850) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 
    at android.view.View.getDisplayList(View.java:10420) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:2850) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 
    at android.view.View.draw(View.java:10986) 
    at android.widget.FrameLayout.draw(FrameLayout.java:450) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2152) 
    at android.view.View.getDisplayList(View.java:10422) 
    at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:852) 
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:1910) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634) 
    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4424) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 

不是完全禁用硬件加速其他,是有辦法檢查一個給定的畫布功能,支持硬件加速和如果它不關閉它?

+0

Canvas.isHardwareAccelerated()不工作嗎? – DeeV

回答

3

壞消息:不,沒有辦法以編程方式檢查給定函數是否支持硬件加速。

好消息:你是不是碰上這第一個,和有問題的功能(以及大量有關硬件加速等良好的位)是很好的證明here

  • 帆布
    • clipPath
    • clipRegion
    • drawPicture
    • drawPoints
    • drawPosText
    • drawTextOnPath
    • drawVertices
  • 油漆
    • setLinearText
    • setMaskFilter
    • setRasterizer

請注意,該文檔還列出了一些與不同行爲的功能。

一個可靠的解決方法是確定代碼中存在問題的操作,然後將這些操作繪製到位圖上,然後將位圖移動到加速畫布上。

+0

感謝您的Android博客文章的鏈接,不知何故,我錯過了那一個! – NPike

相關問題