android4.0 開啟硬體加速後應用執行出錯 android4.0 開啟硬體加速後應用執行出錯...

iteye_21202發表於2013-04-28

android4.0 開啟硬體加速後應用執行出錯

分類: 移動開發 android 400人閱讀 評論(0) 收藏 舉報

目錄(?)[+]

Android4.0 開啟硬體加速後部分應用執行出錯。


出現異常:


12-20 15:18:19.543: E/AndroidRuntime(26301): FATAL EXCEPTION: main
12-20 15:18:19.543: E/AndroidRuntime(26301): java.lang.UnsupportedOperationException
12-20 15:18:19.543: E/AndroidRuntime(26301): at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:429)
12-20 15:18:19.543: E/AndroidRuntime(26301): at cn.hpc.ui.MyView.drawArea(MyView.java:66)


關閉硬體加速則執行正常。


原因在這裡

http://developer.android.com/guide/topics/graphics/hardware-accel.html

Hardware Acceleration


Beginning in Android 3.0 (API level 11), the Android 2D rendering pipeline is designed to better support hardware acceleration.

從Android 3.0(API Level 11)開始,Android的2D渲染管線可以更好的支援硬體加速。硬體加速使用GPU進行View上的繪製操作。

... ...


Unsupported Drawing Operations

不支援的繪圖方法:

我的應用中,正好用到第一種 clipPath.所以執行出錯。

問題找到,

解決方法:

有4種控制元件硬體加速的方法。


1 Application level

In your Android manifest file, add the following attribute to the<application>tag to enable hardware acceleration for your entire application:

在應用程式AndroidManifest.xml檔案中,為application標籤新增如下的屬性即可為整個應用程式true開啟、false關閉硬體加速

<application android:hardwareAccelerated="false" ...> 


2 Activity level

在應用程式AndroidManifest.xml檔案中,只需在activity元素中新增android:hardwareAccelerated屬性即可。
例:在application級別開啟硬體加速,但在activity上關閉硬體加速。
<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

3 Window level

If you need even more fine-grained control, you can enable hardware acceleration for a given window with the following code:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

Note: You currently cannot disable hardware acceleration at the window level.


4 View level

You can disable hardware acceleration for an individual view at runtime with the following code:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);


測試中第1, 2 中都無效,第3種只能開啟硬體加速,而不能關閉硬體加速。

只有第4種適合。只對當前View關閉硬體加速。
優點:View中使用到上述硬體加速不支援的方法時,強制關閉硬體加速。其它地方,由系統決定是否硬體加速。

相關文章