Android 4.0硬件加速及繪制技巧
3.3 View的層和動(dòng)畫的關(guān)系
當(dāng)你的應(yīng)用程序已經(jīng)使用了硬件加速的話,硬件層能夠帶來(lái)更為快速和更為平滑的動(dòng)畫效果。當(dāng)對(duì)一個(gè)復(fù)雜的View進(jìn)行動(dòng)畫操作時(shí),因?yàn)橐M(jìn)行很多的畫操作,所以并不可能總是能達(dá)到60幀每秒。在這種情況下可以通過(guò)硬件層來(lái)渲染為硬件紋理來(lái)提高性能。硬件紋理操作可以用作對(duì)一個(gè)view進(jìn)行動(dòng)畫操作,當(dāng)進(jìn)行動(dòng)畫的時(shí)候可以減少對(duì)View自身頻繁的重繪。除非你改變這個(gè)view的屬性(調(diào)用invalidate()方法)或者你手動(dòng)的調(diào)用invalidate()。如果在你的應(yīng)用中運(yùn)行一個(gè)動(dòng)畫,但是并沒(méi)有得到你想要的平滑效果,可以考慮為你要?jiǎng)赢嫷膙iew開啟硬件層。
當(dāng)一個(gè)View通過(guò)硬件層返回時(shí),當(dāng)所有的層疊加后最終的畫面顯示在屏幕時(shí),View一些屬性會(huì)被同時(shí)被處理。設(shè)置這些屬性是十分有效率的,因?yàn)樗麄儾恍枰猇iew去invalidate和重繪。如下的屬性將影響層的疊加,設(shè)置這些屬性將會(huì)使View自動(dòng)請(qǐng)求刷新,而且不需要對(duì)View進(jìn)行重繪。
◆alpha: 改變層的透明度。
◆x, y, translationX, translationY: 改變層的位置
◆scaleX, scaleY: 改變層的大小
◆rotation, rotationX, rotationY:在3D空間內(nèi)改變層的方向
◆pivotX, pivotY: 指定它進(jìn)行變形的原點(diǎn)位置
這些屬性是通過(guò)ObjectAnimator對(duì)象對(duì)一個(gè)view進(jìn)行動(dòng)畫操作時(shí)所使用的,如果你想訪問(wèn)這些屬性,直接調(diào)用這些屬性的setter或者getter方法,例如想改變View的alpha則直接調(diào)用setAlpha()。如下的代碼片段顯示了一個(gè)View通過(guò)Y軸進(jìn)行3D旋轉(zhuǎn)。
view.setLayerType(View.LAYER_TYPE_HARDWARE, null); ObjectAnimator.ofFloat(view, "rotationY", 180).start();
因?yàn)橛布䦟訒?huì)消耗視頻的內(nèi)存,強(qiáng)烈的推薦你在作動(dòng)畫的時(shí)候啟用他們,當(dāng)動(dòng)畫完成了之后禁用他們,你可以通過(guò)動(dòng)畫監(jiān)聽(tīng)來(lái)完成這些。代碼如下:
View.setLayerType(View.LAYER_TYPE_HARDWARE, null); ObjectAnimator animator= ObjectAnimator.ofFloat(view, "rotationY", 180); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { view.setLayerType(View.LAYER_TYPE_NONE, null); } }); animator.start();
4 Android 4.0提示和技巧
切換到硬件加速2D圖形可以立即增強(qiáng)表現(xiàn),但是你還是需要通過(guò)如下的建議來(lái)設(shè)計(jì)你的應(yīng)用程序來(lái)更有效率的使用GPU。
4.1 減少你程序中使用View的數(shù)量
你系統(tǒng)中畫的view的數(shù)量越多,你的程序就會(huì)越慢,在軟件繪制的流程也是一樣的,減少view的數(shù)量是優(yōu)化你UI的一個(gè)最簡(jiǎn)單的方法。
4.2 避免過(guò)多繪制
不要過(guò)多的疊加層,當(dāng)一個(gè)View被其他view完全遮擋住了的話,最好把被遮擋的view移除掉。如果你需要繪制不同的層做一個(gè)疊加效果的話,考慮把這些層合并為一個(gè)層。就現(xiàn)在的硬件來(lái)看,有一個(gè)好的經(jīng)驗(yàn)就是動(dòng)畫的每幀不要繪制多余屏幕像素2.5倍的像素?cái)?shù)量(bimap中的透明像素也計(jì)算在內(nèi))。
4.3 不要在繪制的方法中創(chuàng)建繪制對(duì)象
一個(gè)常見(jiàn)的錯(cuò)誤就是當(dāng)繪制方法被調(diào)用的時(shí)候,每次都要?jiǎng)?chuàng)建一個(gè)新的Paint或者Path。這將迫使垃圾回收器過(guò)于頻繁的運(yùn)行,這將對(duì)緩沖和硬件的繪制造成影響。
4.4 不要過(guò)于頻繁的修改形狀
以復(fù)雜的shapes,path和旋轉(zhuǎn)為例,這些繪制都會(huì)用到紋理的遮罩。每當(dāng)你創(chuàng)建或者修改一個(gè)path,硬件渲染過(guò)程都會(huì)創(chuàng)建一個(gè)新的遮罩,這耗費(fèi)的代價(jià)是相當(dāng)大的。
4.5 不要過(guò)于頻繁的修改bitmap
每當(dāng)修改一次bitmap的內(nèi)容,當(dāng)你下次再繪制它的時(shí)候都會(huì)以GPU的紋理形式上傳一次。
4.6 要小心使用alpha通道
當(dāng)你使用setAlpha ,AlphaAnimation或者ObjectAnimator設(shè)置一個(gè)View的透明效果時(shí)。它將需要2倍離屏的渲染緩沖填充率,當(dāng)應(yīng)用一個(gè)alpha到一個(gè)大的View上的時(shí)候,考慮設(shè)置view 層的類型為L(zhǎng)AYER_TYPE_HARDWARE。