自定義view使用硬件加速導致繪製異常

需求

繪製曲線圖,由於不太會貝塞爾曲線,因此選擇了繪製折線,再加上cornerPathEffect的效果來實現。

報錯

在高端機上會出現曲線圖錯位,因爲使用機器默認開啓了硬件加速
而導致錯位的正是下面這句代碼:

CornerPathEffect cornerPathEffect = new CornerPathEffect(45);

原因

要想解決這個問題,首先我們要了解什麼是硬件加速

從Android 3.0開始(API L11),Android開始全面使用硬件加速來進行2D渲染,硬件加速是指Android中在View上進行繪製的圖形圖像都使用GPU來進行繪製,使用硬件加速,在大部分時候都讓繪製更加流暢,但付出的代價是需要消耗更多的內存資源。

硬件加速在API L14之上是默認開啓的,對於基本的View繪製,通過硬件加速可以增加繪圖的流程性,但是要注意的是,並不是所有的2D圖形繪製API都支持硬件加速。

通過開發者選項中的“強制進行GPU渲染”,用戶可以爲全局打開硬件加速。在3.0 以上的Android中,系統已經對大部分動畫都進行了硬件加速。

Ok,瞭解什麼是硬件加速以後,我們需要看看哪些屬性是不支持硬件加速的

這裏寫圖片描述
這裏寫圖片描述

可以看到
CornerPathEffect這個屬性是不支持加速的,找到了bug的原因,下面我們就看看怎麼才能解決。方法就是,禁用硬件加速。

解決

硬件加速,可以在以下幾個層面來設置:

Application

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

Activity

<application android:hardwareAccelerated="true">  
<activity ... />  
<activity android:hardwareAccelerated="false" />  
</application>  

View

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

像我在項目裏遇到的問題,直接在View層級禁用硬件加速即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章