詳解Android開(kāi)發(fā)中硬件加速支持的使用方法
Android從3.0(API Level 11)開(kāi)始,在繪制View的時(shí)候支持硬件加速,充分利用GPU的特性,使得繪制更加平滑,但是會(huì)多消耗一些內(nèi)存。
開(kāi)啟或關(guān)閉硬件加速:
由于硬件加速自身并非完美無(wú)缺,所以Android提供選項(xiàng)來(lái)打開(kāi)或者關(guān)閉硬件加速,默認(rèn)是關(guān)閉。可以在4個(gè)級(jí)別上打開(kāi)或者關(guān)閉硬件加速:
Application級(jí)別:<applicationandroid:hardwareAccelerated="true" ...>
Activity級(jí)別:<activity android:hardwareAccelerated="false" ...>
Window級(jí)別:
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:目前為止,Android還不支持在Window級(jí)別關(guān)閉硬件加速。
View級(jí)別:
myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
注意:目前為止,Android還:不支持在View級(jí)別開(kāi)啟硬件加速。
檢測(cè)當(dāng)前是否啟用了硬件加速:
// 方法一 // 此方法返回true,如果myView掛在一個(gè)開(kāi)啟了硬件加速的Window之下, // 也就是說(shuō),它在繪制的時(shí)候不一定使用了硬件加速,getDrawingCache myView.isHardwareAccelerated(); // 方法二 // 返回true,如果canvas在繪制的時(shí)候啟用了硬件加速 // 盡量采用此方法來(lái)判斷是否開(kāi)啟了硬件加速 canvas.isHardwareAccelerated();
控制硬件加速開(kāi)關(guān)
引言中說(shuō)過(guò)控制硬件加速可以在不同層級(jí)進(jìn)行,這樣可以避免因?yàn)橐粋€(gè)繪制動(dòng)作不支持而導(dǎo)致整個(gè)應(yīng)用都不可以使用硬件加速這樣很愚蠢的情況發(fā)生??偣灿兴膫€(gè)層級(jí),從上到下是:
1. Application
應(yīng)用程序等級(jí)控制硬件加速,在AndroidManifest.xml中進(jìn)行:
<application android:hardwareAccelerated="true" ...>
在Android4.0以上(包含)默認(rèn)就為true,即打開(kāi)。如果整個(gè)應(yīng)用都不想用硬件加速,則設(shè)定為false。
2. Activity
Activity等級(jí)的控制方法還是在AndroidManifest.xml中進(jìn)行,如下展示了應(yīng)用整體使用硬件加速,而某一個(gè)Activity不使用的例子:
<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /> </application>
3. Window
窗口級(jí)控制,如果只是想讓某個(gè)窗口使用硬件加速:
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
4. View
可以通過(guò)代碼在運(yùn)行時(shí)控制單個(gè)View是否使用硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
LAYER_TYPE_HARDWARE即為使用硬件加速(GPU),LAYER_TYPE_SOFTWARE使用CPU進(jìn)行繪制。
理解View的繪制模型:
1.沒(méi)有硬件加速:invalidate the view hierarchy ------> draw the view hierarchy
2.有硬件加速:invalidate the view hierarchy ------> record and update the display list ------> draw the display list
硬件加速的限制:
目前,Android對(duì)硬件加速的支持并非完美,有些繪制操作在開(kāi)啟硬件加速的情況下不能正常工作(具體的列表可以參考Android開(kāi)發(fā)者文檔)。
不過(guò)Android可以保證內(nèi)置的組件和應(yīng)用支持硬件加速。因此,如果應(yīng)用中只使用了標(biāo)準(zhǔn)UI組件,可以放心開(kāi)啟硬件加速。
隨著Android的版本升級(jí),相信一段時(shí)間之后,硬件加速可以得到完美的支持。
開(kāi)啟硬件加速之后的異常反應(yīng):
1.某些UI元素沒(méi)有顯示:可能是沒(méi)有調(diào)用invalidate
2.某些UI元素沒(méi)有更新:可能是沒(méi)有調(diào)用invalidate
3.繪制不正確:可能使用了不支持硬件加速的操作, 需要關(guān)閉硬件加速或者繞過(guò)該操作
4.拋出異常:可能使用了不支持硬件加速的操作, 需要關(guān)閉硬件加速或者繞過(guò)該操作
相關(guān)文章
Android獲取當(dāng)前手機(jī)網(wǎng)絡(luò)類型(2g、3g、4g、wifi)以及手機(jī)型號(hào)、版本號(hào)代碼
這篇文章主要介紹了Android獲取當(dāng)前手機(jī)網(wǎng)絡(luò)類型(2g、3g、4g、wifi)以及手機(jī)型號(hào)、版本號(hào)的相關(guān)資料,需要的朋友可以參考下2016-03-03老生常談Listview中onItemClick中的各個(gè)參數(shù)(推薦)
下面小編就為大家?guī)?lái)一篇老生常談Listview中onItemClick中的各個(gè)參數(shù)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android自定義ViewPagerIndicator實(shí)現(xiàn)炫酷導(dǎo)航欄指示器(ViewPager+Fragment)
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewPagerIndicator實(shí)現(xiàn)炫酷導(dǎo)航欄指示器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Activity/Fragment結(jié)束時(shí)處理異步回調(diào)的解決方案
這篇文章主要介紹了關(guān)于在Activity/Fragment結(jié)束時(shí)處理異步回調(diào)的解決方案,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03詳解Android?Flutter中SliverAppBar的使用教程
對(duì)于一個(gè)APP來(lái)說(shuō),肯定會(huì)有一個(gè)AppBar,這個(gè)AppBar一般包含了APP的導(dǎo)航信息等。在lutter已經(jīng)為我們提供了一個(gè)非常強(qiáng)大的AppBar組件,這個(gè)組件叫做SliverAppBar。本文就來(lái)聊聊它的具體使用吧2023-01-01利用adt-bundle輕松搭建Android開(kāi)發(fā)環(huán)境與Hello world(Windows)
這篇文章主要介紹了利用adt-bundle在Windows下輕松搭建Android開(kāi)發(fā)環(huán)境與Hello world,感興趣的小伙伴們可以參考一下2016-07-07Android開(kāi)發(fā)實(shí)現(xiàn)的圓角按鈕、文字陰影按鈕效果示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的圓角按鈕、文字陰影按鈕效果,涉及Android界面布局與屬性設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2019-04-04