# 問題
最近使用Matrix遇到一件比較詭異的問題,使用
Matrix.setPolyToPoly
接口繪制一個多邊形,在
華為
手機上遇到變形錯位的問題.
把 Matrix 作用到系統傳遞過來的 canvas 上面,理論上來說這應該是沒有問題的,但不知華為系統對 canvas 作了什麼處理,就是不正常.
# 解決辦法
通過查閱相關資料,發現這個問題是由硬體加速造成的.
簡單的說下硬體加速的優缺點:硬體加速能使用GPU來加速2D圖像的渲染速度,但是硬體加速并不能完全支援所有的渲染操作,那麼使用硬體加速就可能導緻渲染出現錯誤.
# 開啟和關閉硬體加速
對硬體加速的開關可以在不同的級别進行控制:
- Application
- Activity
- Windows
- View
Application級别
在Application級别控制硬體加速的開關:
<application android:hardwareAccelerated="true" ...>
Activity級别
可以對單個Activity控制是否啟用硬體加速:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
Window級别
對Window添加是否啟用硬體加速:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
View級别
指定View上關閉硬體加速:
mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或者使用 android:layerType="software" 來關閉硬體加速
判斷View是否啟用了硬體加速 view.isHardwareAccelerated() 或者 canvas.isHardwareAccelerated()
使用自定義canvas解決此問題點選檢視Android setPolyToPoly遇到的問題(二)
記錄點點滴滴,如果有問題請指點.