需求
繪製曲線圖,由於不太會貝塞爾曲線,因此選擇了繪製折線,再加上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層級禁用硬件加速即可。