在平時(shí)開(kāi)發(fā)過(guò)程中,我們偶爾會(huì)發(fā)現(xiàn)有些較長(zhǎng)的圖片在Imageview內(nèi)加載顯示白屏,也沒(méi)啥明顯的報(bào)錯(cuò),而且在不同性能的手機(jī)上有不同的效果。有的可以加載,有的不行。其實(shí)這個(gè)原因是由于GPU渲染限制導(dǎo)致的白屏問(wèn)題。性能較差的手機(jī)上GPU的渲染限制較大,容易出現(xiàn)白屏的問(wèn)題。針對(duì)這樣的問(wèn)題有以下幾個(gè)解決方案,看個(gè)人的使用場(chǎng)景進(jìn)行取舍
創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的墨江網(wǎng)站建設(shè)公司,墨江接單;提供網(wǎng)站制作、做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行墨江網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
1、關(guān)閉硬件加速
在manifest文件里面設(shè)置 hardwareAcceleration = “false”可以關(guān)閉了硬件加速
這樣是可以加載長(zhǎng)圖了,但是APP變卡了,體驗(yàn)非常不好,看個(gè)人取舍。
這也是最簡(jiǎn)單的方案
2、裁剪拼接顯示(分割顯示)
每次顯示在imageView中的圖不是原圖的bitmap,通過(guò)一個(gè)方法
Bitmap.createBitmap(bitmap,x,y,width,height)創(chuàng)建一個(gè)bitmap,長(zhǎng)寬符合屏幕要求,這樣就不會(huì)超過(guò)像素限制。實(shí)際操作以后發(fā)現(xiàn),的確可以顯示大圖,但是效果也不好,拖動(dòng)的時(shí)候幀數(shù)比較低,比上一條的那種好點(diǎn),但是沒(méi)有達(dá)到最好的要求(就是像快圖瀏覽里面那樣的),即便手機(jī)自帶的相冊(cè)app也比這個(gè)流暢一些。
這個(gè)方案推薦一個(gè)比較好的庫(kù):
使用注意點(diǎn):不要設(shè)置全局的matrix canvas.concat()
改寫(xiě)后:
3、取GPU支持最大的高度將圖片進(jìn)行縮放加載
由于是GPU加載限制導(dǎo)致的問(wèn)題,我們可以找到GPU加載的閾值,然后通過(guò)閾值來(lái)計(jì)算出一個(gè)合理的尺寸
附幾個(gè)方法:
首先,存儲(chǔ)在磁盤(pán)上的圖片是被壓縮過(guò)的(以JPG,PNG或類(lèi)似的格式存儲(chǔ))。 一旦將圖片加載到內(nèi)存中,它就不再被壓縮,并占用盡可能多的圖片的所有像素所需的內(nèi)存空間。
其次,加載大圖的步驟:
1.獲取圖片的寬和高:BitmapFactory.Options
BitmapFactory可以為我們提供圖片的元數(shù)據(jù)。我們可以使用這個(gè)類(lèi)來(lái)實(shí)現(xiàn)第一步。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds =true;//不想將圖片加載到內(nèi)存中。獲取圖片的相關(guān)信息(寬度,高度等),并使用這些信息來(lái)計(jì)算縮放比例。
BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);
2.根據(jù)圖片的寬和高計(jì)算縮放比Reducing Image Size (In Memory)
:現(xiàn)在我們需要計(jì)算 inSampleSize 。其是BitmapFactory.Options類(lèi)的一個(gè)屬性,用于設(shè)置圖片的縮放比。
如果我們有一張尺寸為1000x1000的圖片,并且在解碼之前設(shè)置inSampleSize的值為2, 那么解碼之后,我們將得到一張尺寸為500x500的圖片。
BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds =true;options.inSampleSize = 3; BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);
注意:inSampleSize 設(shè)置為 5 , 最終 會(huì)被 取整為 4
3.根據(jù)縮放比將圖片加載到內(nèi)存中。Reducing Image Size (In Disk)
我們還可以使用Bitmap的 compress 方法對(duì)磁盤(pán)上的圖片進(jìn)行壓縮。我們來(lái)看看在不改變圖片質(zhì)量的情況下圖片被壓縮后的大小。? 100 表示與原圖保持相同的質(zhì)量。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] bitmapdata = bos.toByteArray();
通過(guò)計(jì)算得到圖片在磁盤(pán)上的大小為1.6 MB。
我們把compress方法中的質(zhì)量參數(shù)改為50,并再次計(jì)算圖片大小
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos);
通過(guò)計(jì)算得到圖片在磁盤(pán)上的大小為24.4 KB。
注意 :在改變compress方法中的質(zhì)量參數(shù)的時(shí)候,壓縮格式應(yīng)該是.JPEG。設(shè)置為PNG格式的時(shí)候,修改是無(wú)效的。
第一你加載的圖片是要顯示還是做別的事情?
第二你開(kāi)發(fā)的應(yīng)用是在手機(jī)平板上還是電視上?
如果你要加載的圖片是為了要顯示的話,建議找美工把圖片處理一下。Android做為嵌入式設(shè)備本身每個(gè)應(yīng)用的內(nèi)存是受限的。