# 問題
最近使用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);
判斷View是否啓用了硬件加速 view.isHardwareAccelerated()
或者 canvas.isHardwareAccelerated()
使用自定義canvas解決此問題點擊查看Android setPolyToPoly遇到的問題(二)
記錄點點滴滴,如果有問題請指點.