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
不支持的繪圖方法:
- Canvas
- Paint
- Xfermodes
問題找到,
解決方法:
有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
<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);