Android 實(shí)現(xiàn)加載大圖片的方法
項(xiàng)目簡(jiǎn)介:
該項(xiàng)目為加載大圖片
詳細(xì)介紹:
對(duì)于超大的圖片,如果不縮放的話,容易導(dǎo)致內(nèi)存溢出。而經(jīng)過(guò)處理后,無(wú)論多大的圖片,都能夠在手機(jī)屏幕上加載出來(lái),不會(huì)導(dǎo)致內(nèi)存溢出。當(dāng)然,臉黑的除外
該應(yīng)用涉及到的知識(shí)有:
- 1.Bitmap的使用
- 2.Android手機(jī)中加載圖片的原理
有的時(shí)候,我們加載一張不足1M的圖片,盡管手機(jī)的堆內(nèi)存有16M,仍然會(huì)導(dǎo)致內(nèi)存溢出,why?
這就更計(jì)算機(jī)加載圖片的原理有關(guān)了:
1).手機(jī)會(huì)解析圖片的所有像素信息,把每個(gè)像素信息都存入到內(nèi)存中
2).Android中保存圖片是用ARGB保存的,A表示阿爾法透明度,所以一個(gè)像素點(diǎn)占用了4個(gè)字節(jié)
例如:一張1080*720像素的24位位圖圖片,可能實(shí)際上經(jīng)過(guò)壓縮后大小只有幾十K,而在android手機(jī)加載這張圖片所需要的內(nèi)存大小為:
1080*720*(3+1)=3110400 byte = 3037 KB = 2.9MB
實(shí)際上,圖片中還包含一點(diǎn)其他的信息,例如圖片保存的格式,使用的相機(jī)名稱,以及拍攝時(shí)間等,所以總體來(lái)說(shuō)要比3110400字節(jié)大一旦,大概多上幾十個(gè)字節(jié)
步驟:
1.創(chuàng)建一個(gè)Android項(xiàng)目,編寫布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="hhh.exercise.smultimedia_a_image.MainActivity" > <EditText android:id="@+id/ed" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="a.jpg" android:textColor="#00ff00" android:textSize="30sp" /> <requestFocus /> <Button android:onClick="see" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="點(diǎn)擊看片" android:textColor="#00ffff" android:textSize="30sp" /> <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:src="@drawable/ic_launcher" /> </LinearLayout>
界面如下所示:
2.在MainActivity中編寫代碼:
public class MainActivity extends Activity { private EditText ed; private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ed = (EditText) findViewById(R.id.ed); iv = (ImageView) findViewById(R.id.iv); } public void see(View view) { // 確定要加載的圖片(這里為了調(diào)試方面,把所有的圖片都放在SD卡中,然后在界面上輸入圖片的名字,根據(jù)給名字拼接字符串) String fileName = ed.getText().toString(); String path = Environment.getExternalStorageDirectory().getPath()+ "/" + fileName; // 該類為位圖工廠(BitmapFactory)的內(nèi)部類,用來(lái)封裝參數(shù)對(duì)象 Options opts = new Options(); // 不為像素申請(qǐng)內(nèi)存,只獲取圖片的寬、高信息 // inJustDecodeBound該字段設(shè)置為true,那么位圖工廠構(gòu)建BitMap對(duì)象時(shí)返回的是空值,但是會(huì)把圖片的一些信息返回在Options對(duì)象中(如圖片的寬、高等) opts.inJustDecodeBounds = true; // 第二個(gè)參數(shù)是解析圖片時(shí)傳入的參數(shù),由于可能傳入的參數(shù)過(guò)多,所以直接把所有參數(shù)封裝成一個(gè)對(duì)象 BitmapFactory.decodeFile(path, opts); // 獲取圖片的額寬高 int imgWidth = opts.outWidth; int imgHeight = opts.outHeight; // 獲取當(dāng)前手機(jī)屏幕的寬高 Display dp = getWindowManager().getDefaultDisplay(); int screenWidth = dp.getWidth(); int screenHeight = dp.getHeight(); // 設(shè)置默認(rèn)縮放比為1 int scale = 1; // 計(jì)算圖片寬高與屏幕寬高比例,即計(jì)算寬縮放比,高縮放比 int scaleWidth = imgWidth / screenWidth; int scaleHeight = imgHeight / screenHeight; // 選擇縮放比例,如果圖片比屏幕小,就不進(jìn)行縮放.如果圖片比屏幕大,但是寬高縮放比例不同,選擇縮放比大 if (scaleWidth >= scaleHeight && scaleWidth > 1) { scale = scaleWidth; } else if (scaleWidth < scaleHeight && scaleHeight > 1) { scale = scaleHeight; } // 在Options的對(duì)象中設(shè)置縮放比例 opts.inSampleSize = scale; // 一定要把inJustDecodeBound該字段設(shè)置為false,實(shí)際上默認(rèn)值是false, // 但是在前面的代碼中已經(jīng)改為了true,所以要更改過(guò)來(lái)。當(dāng)然,也可以重新new 一個(gè)Option是對(duì)象 opts.inJustDecodeBounds = false; Bitmap bm = BitmapFactory.decodeFile(path, opts); iv.setImageBitmap(bm); } }
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- android 大圖片拖拽并縮放實(shí)現(xiàn)原理
- Android 實(shí)現(xiàn)WebView點(diǎn)擊圖片查看大圖列表及圖片保存功能
- Android中超大圖片無(wú)法顯示的問(wèn)題解決
- Android高效加載大圖、多圖解決方案 有效避免程序OOM
- Android編程實(shí)現(xiàn)大圖滾動(dòng)顯示的方法
- Android 加載大圖、多圖和LruCache緩存詳細(xì)介紹
- Android實(shí)現(xiàn)網(wǎng)絡(luò)加載圖片點(diǎn)擊大圖后瀏覽可縮放
- Android實(shí)現(xiàn)大圖滾動(dòng)顯示效果
- Android仿頭條、微信大圖預(yù)覽視圖的方法詳解
相關(guān)文章
Android RollPagerView實(shí)現(xiàn)輪播圖
這篇文章主要介紹了Android RollPagerView實(shí)現(xiàn)輪播圖的相關(guān)資料,這里提供實(shí)例來(lái)實(shí)現(xiàn)輪播圖的簡(jiǎn)單實(shí)例,希望能幫助到大家,需要的朋友可以參考下2017-08-08Android Studio手動(dòng)配置Gradle的方法
Gradle:Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化建構(gòu)工具。它使用一種基于Groovy的特定領(lǐng)域語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置,拋棄了基于XML的各種繁瑣配置,本文給大家介紹Android Studio手動(dòng)配置Gradle的方法,一起看看吧2017-11-11Android編程讀取Assets所有文件(遍歷每一個(gè)文件夾)并存入sdcard的方法
這篇文章主要介紹了Android編程讀取Assets所有文件(遍歷每一個(gè)文件夾)并存入sdcard的方法,涉及Android針對(duì)文件與目錄的遍歷及I/O操作相關(guān)技巧,需要的朋友可以參考下2016-02-02Android 10 啟動(dòng)之servicemanager源碼解析
這篇文章主要為大家介紹了Android 10 啟動(dòng)之servicemanager源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Android動(dòng)態(tài)表格的實(shí)現(xiàn)代碼(內(nèi)容、樣式可擴(kuò)縮)
這篇文章主要介紹了Android動(dòng)態(tài)表格的實(shí)現(xiàn)代碼(內(nèi)容、樣式可擴(kuò)縮),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09