當前位置:首頁 » 安卓系統 » android載入本地圖片

android載入本地圖片

發布時間: 2022-06-26 08:03:12

1. android studio添加本地圖 片

添加網路地圖服務的話,直接在bulid.gradel中,添加他們給的連接地址,會自動下載的,他們應該有文檔的,如果沒有android studio的形式,只能自己手動去復制

2. android studio添加本地 圖片

今天要介紹的是Github上一個使用非常廣泛的圖片非同步載入庫Android-Universal-Image-Loader,該項目的功能十分強大,可以說是我見過的目前功能最全、性能最優的圖片非同步載入解決方案。做Android的同學都知道,Android載入大量圖片時,由於系統分配給圖片載入的內存大小有限,所以,如果載入圖片量非常大的話容易報OOM異常,關於這個異常已經有不少解決方案了,我就不贅述。下面就簡要介紹下這個開源項目的主要功能和使用: 一、功能概要 多線程圖片載入; 靈活更改ImageLoader的基本配置,包括最大線程數、緩存方式、圖片顯示選項等; 圖片非同步載入緩存機制,包括內存緩存(軟引用)及本地緩存; 對載入過程實現監聽和事件處理; 能夠配置載入圖片的顯示選項,包括圖片圓角處理和載入完成顯示動畫等; 二、基本使用 下載jar包universal-image-loader-1.8.5-with-sources.jar並導入工程(這應該不用教了吧) 配置Manifest文件,添加網路請求和訪問外部存儲的許可權,因為要進行網路請求和本地緩存 [html] view plain <uses-permission android:name="android.permission.INTERNET" /> <!-- Include next permission if you want to allow UIL to cache images on SD card --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 3. 實現自定義的MyApplication類,並初始化ImageLoader,注意要在Manifest的Application標簽註明 android:name=".MyApplication",否則還是使用的默認的Application類。 [java] view plain public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // This configuration tuning is custom. You can tune every option, you may tune some of them, // or you can create default configuration by // ImageLoaderConfiguration.createDefault(this); // method. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .threadPriority(Thread.NORM_PRIORITY - 2) .() .discCacheFileNameGenerator(new Md5FileNameGenerator()) .tasksProcessingOrder(QueueProcessingType.LIFO) .enableLogging() // Not necessary in common .build(); //Initialize ImageLoader with configuration ImageLoader.getInstance().init(config); } } 4. 配置圖片載入及顯示選項,此處有多種自定義配置選項,可以查看doc文檔一一了解,這里就不贅述(實在太多) [java] view plain DisplayImageOptions options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_launcher) .showImageForEmptyUri(R.drawable.ic_launcher) .showImageOnFail(R.drawable.ic_launcher) .cacheInMemory(true) .cacheOnDisc(false) .displayer(new RoundedBitmapDisplayer(20)) .build(); 5. 使用ImageLoader載入圖片,這里以在ListView中為每個item非同步載入圖片為例,只要在Adapter的getView方法中調用如下方法即完成了非同步列表圖片載入,其中options是之前定義的圖片載入和顯示選項,animateFirstListener是當圖片第一次載入的監聽事件,目的在於顯示一個淡入的顯示效果動畫,可以添加其他事件 另外,本例還實現了當列表滑動過程中暫停載入和在用戶手放開時才開始載入的功能,這樣的好處是保證在列表圖片非同步載入的過程中不出現卡頓的現象,保證載入的順滑性。實現這一功能的手段是使ListView監聽一個由ImageLoader包含的監聽事件PauseOnScrollListener。 若設置cacheOnDisc(true)的話,則緩存的文件可以在/sdcard/Android/data/[package_name]/cache目錄下看到。不過建議定期清理緩存,否則時間一長,SD卡就會被占滿了,同時也可以在ImageLoaderConfiguration中配置SD的緩存策略,有限制緩存文件數量的,有限制緩存文件最大尺寸等選項。 如果在使用過程中遭遇OOM異常,則建議在ImageLoaderConfiguration中設置threadPoolSize在1-5之間合適。在DisplayOption配置時使用。

3. android imageview獲取本地圖片的問題

從本地獲得的圖片不能以int的方式放在int數組里,可以放在String數組或者,Bitmap對象的list里。
需要時直接ImageView.setImageBitmap(BitmapList.get(i));

4. Android載入本地圖片需要子線程嗎

開不開線程主要是取決於用戶體驗。網路圖片受網速影響較大如果不開線程會卡頓影響用戶體驗。而本地圖片讀取可以很快,不會出現UI卡頓,不會影響用戶體驗。當然開線程也行。

5. android studio添加本地圖片

將圖片後綴改為.png 直接貼到Drawable上

6. android如何載入超大解析度圖片

因為你要求圖片不能縮放,不能降低質量,而且有7M,oom是必須的,所以你能做的只能是載入你看得見的地方,意思就是說剪裁著看,先不載入,按屏幕的解析度的1.5倍或多一些進行剪裁(這個度自己控制項),當向某一個方向滑時,檢測坐標如果快超出時,載入右邊的下一幅。
這個有點類似於游戲中的地圖貼圖,也是分塊的。

7. android listView動態載入本地圖片(拍照後載入上去)

調用android自身的相機,在onActivityResult回調函數里寫載入圖片方法

8. Android 保存圖片到本地。

這里只介紹按下「保存」後如何將一個Bitmap對象保存為圖片文件的執行步驟,對圖片的下載,圖片到Bitmap對象的轉換,Bitmap對象的格式轉換和壓縮,以及界面設計部分全部都忽略了。

  • 確定存儲路徑

  • 獲取外部存儲許可權

  • 確定外部存儲狀態

  • 確定文件名

  • 保存到文件中

  • 發送廣播,通知系統掃描保存後的文件

  • 確定存儲路徑

    在Android中文件存儲路徑包括內部存儲和外部存儲兩種類型。

    對內部存儲,當一個app被安裝到手機後,Android系統會在內部存儲的/data/data/目錄下創建一個以包名稱命名的文件夾。例如/data/data/com.sohu.inputmethod.sogou/。一個應用對內部存儲的所有訪問都被限制在這個文件夾中,也就是說Android應用只能在該目錄中讀取,創建,修改文件。對該目錄之外的其他內部存儲中的目錄都沒有任何操作的許可權。因此,如果將圖片保存在內部存儲中,只能被應用自身讀取,其他應用均無法讀取。如果需要讓系統圖庫,相冊或其他應用能夠找到保存的圖片,必須將圖片保存到外部存儲中。

    對外部存儲,當一個app被安裝到手機後,Android系統會在外部存儲的/Android/data/目錄下創建一個以包名命名的文件夾(這里第一個/不是根路徑,而是相對外部存儲所掛載路徑的相對路徑)。例如/storage/emulated/0/Android/data/com.sohu.inputmethod/。這個路徑同樣只能被應用自身讀取,其他應用不能訪問。因此,也不能將圖片保存在這個目錄中。

    除外部存儲的/Android目錄之外的其他目錄一般都是可以被其他應用訪問的。目前,大多數應用都會在外部存儲的根路徑下建立一個類似包名的多層目錄,以存儲需要共享的文件。例如/storage/emulated/0/sogou/image/。還需要注意的是,很多查看圖片的應用都支持按照文件夾來查看圖片。如果將圖片所在的文件夾取名為image,photo之類的,就無法和其他文件夾區分開,用戶也不能識別該文件夾的用途。因此最好取一個有區分度的文件夾名字,例如網路貼吧就保存在/tieba目錄,微信是保存在/tencent/MicroMsg/WeiXin目錄。

    由於Android系統的碎片化問題,不同設備上外部存儲的路徑很可能會不同,因此,不能直接使用/storage/emulated/0/作為外部存儲的根路徑。
    Android SDK中 Environment類 提供了getExternalStorageDirectory()方法來獲取外部存儲的根路徑。示例如下:

    [java]view plain

  • Stringdir=Environment.getExternalStorageDirectory().getAbsolutePath()+"/tencent/MicroMsg/WeiXin/"

  • 需要注意的是Environment.getExternalStorageDirectory()返回的路徑中最後一個字元不是/,如果需要創建子目錄,需要在子目錄的前後都加上/。

    獲取外部存儲許可權

    由於需要在外部存儲中寫文件,需要在AndroidManifest.xml中增加如下的許可權聲明。

    [java]view plain

  • <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  • 確定外部存儲狀態

    由於外部存儲需要被掛載,也可以被卸載,在寫入文件之前,需要先判斷外部存儲的狀態是否正常。只有狀態正常情況下才可以執行保存文件的操作。獲取外部存儲狀態同樣是通過Environment類,通過Environment.getExternalStorageState()可以得到一個字元串,來表示外部存儲的狀態。同時在Environment類中定義了一系列的String常量表示不同的狀態。在所有的狀態中只有內部存儲處於Environment.MEDIA_MOUNTED狀態時才可以讀寫文件,因此,需要將獲取到的狀態和Environment.MEDIA_MOUNTED做比較,如果不是Environment.MEDIA_MOUNTED狀態,就返回保存失敗。示例如下。

    [java]view plain

  • //獲取內部存儲狀態

  • Stringstate=Environment.getExternalStorageState();

  • //如果狀態不是mounted,無法讀寫

  • if(!state.equals(Environment.MEDIA_MOUNTED)){

  • return;

  • }



  • 確定文件名

    保存的圖片文件名可以由應用根據自身需要自行確定,一般來說需要有一個命名規則,然後根據命名規則計算得到文件名。
    這里列舉幾種常見的命名規則。

  • 隨機命名
    這種命名規則是隨機生成一個字元串或一組數字來對圖片命名。
    字元串可以通過UUID來生成,數字可以通過Random()類來生成,例如:

    [java]view plain

  • //通過UUID生成字元串文件名

  • StringfileName1=UUID.randomUUID().toString();

  • //通過Random()類生成數組命名

  • Randomrandom=newRandom();

  • StringfileName2=String.valueOf(random.nextInt(Integer.MAX_VALUE));

  • 這種命名規則是按照數字從小到大的順序來對圖片命名。
    在程序啟動時先獲取圖片文件名中當前最大數字的文件名,之後每保存一張圖片就將數字加1即可。

  • 時間命名
    這種命名規則是根據保存圖片的當前系統時間來對圖片命名。
    系統時間可以通過System.currentTimeMillis()來獲取,不過System.currentTimeMillis()獲取到的時間是一個long型的整數,如果用它做文件名,無法通過文件名直接看出文件的具體保存時間。可以通過SimpleDateFormat先對當前時間做格式化,然後再將其作為文件名來使用。例如:

    [java]view plain

    使用這種命名規則來命名需要注意的是同一秒鍾可能會有多張圖片需要保存,在得到當前系統時間對應的文件名後,需要判斷該文件是否存在。如果文件已經存在,需要重新生成文件名。重新生成的文件名可以在之前的文件名後加上一個隨機數後綴,或者是用毫秒數做後綴。

  • Calendarnow=newGregorianCalendar();

  • SimpleDateFormatsimpleDate=newSimpleDateFormat("yyyyMMddHHmmss",Locale.getDefault());

  • StringfileName=simpleDate.format(now.getTime());

  • 文件URL命名
    每張網路圖片都有一個對應的圖片URL,可以根據圖片的URL來對圖片命名。
    不過URL中會包含一些不能用作文件名的特殊字元,此外直接用URL來命名可能會帶來安全問題。為了避免這兩個問題,可以將圖片URL的MD5值作為文件名來使用。由於MD5是不可逆的,也就無法通過MD5值反向得到圖片URL,同時MD5值對應的字元串只包含[0-9A-Z],不包含特殊字元,可是作為文件名使用。
    由於每張圖片的URL是唯一的,其對應的文件名也就是唯一的。如果需要每張網路圖片只能生成一個文件,不允許保存為多份拷貝,可以用這種命名規則。在得到URL對應的文件名後,先判斷文件是否已經存在,如果已經存在,直接覆蓋或不處理。

  • 保存到文件中

    保存圖片文件時,通過Bitmap的compress()方法將Bitmap對象壓縮到一個文件輸出流中,然後flush()即可。示例如下。

    [java]view plain

  • try{

  • Filefile=newFile(dir+fileName+".jpg");

  • FileOutputStreamout=newFileOutputStream(file);

  • mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);

  • out.flush();

  • out.close();

  • }catch(Exceptione){

  • e.printStackTrace();

  • }



  • 發送廣播,通知系統掃描保存後的文件

    至此,已經實現將Bitmap對象保存成外部存儲中的一個jpg格式的文件。但此時該文件只是保存在外部存儲的一個目錄中,必須進入其所在的目錄中才可以看到。在系統圖庫,相冊和其他應用中無法看到新建的圖片文件。為了讓其他應用能夠知道圖片文件被創建,必須通知MediaProvider服務將新建的文件添加到圖片資料庫中。

    Android系統中常駐一個MediaProvider服務,對應的進程名為android.process.media,此服務用來管理本機上的媒體文件,提供媒體管理服務。在系統開機或者收到外部存儲的掛載消息後,MediaProvider會調用MediaScanner,MediaScanner會掃描外部存儲中的所有文件,根據文件類型的後綴將文件信息保存到對應的資料庫中,供其他APP使用。

    MediaScannerReceiver是一個廣播接收者,當它接收到特定的廣播請求後,就會去掃描指定的文件,並根據文件信息將其添加到資料庫中。當圖片文件被創建後,就可以發送廣播給MediaScannerReceiver,通知其掃描新建的圖片文件。示例如下。

    [java]view plain

  • try{

  • Filefile=newFile(dir+fileName+".jpg");

  • FileOutputStreamout=newFileOutputStream(file);

  • mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);

  • out.flush();

  • out.close();

  • //保存圖片後發送廣播通知更新資料庫

  • Uriuri=Uri.fromFile(file);

  • sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));

  • }catch(Exceptione){

  • e.printStackTrace();

  • }



  • 圖片的非同步保存

    保存圖片文件時,如果圖片很大,或需要同時保存多張圖片時,就需要較多的時間。為了避免阻塞UI線程,出現幀率下降或ANR,通常需要將圖片保存操作放到線程中去執行。當圖片保存完畢後通過sendMessage()方法通知UI線程保存結果。
    將圖片保存放到後台線程去執行需要增加一些同步機制避免一些多線程問題。例如有兩張圖片需要保存,分別放到兩個線程中去執行,保存圖片時文件名以數字順序增加。第一個線程選中文件名為125.jpg,但此時文件還未創建,第二個線程判斷125.jpg不存在,於是也選取125.jpg作為文件名,兩張圖片就保存到同一個文件中了。

9. android imageloader載入圖片問題。

//顯示圖片的配置
DisplayImageOptionsoptions=newDisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)//載入中顯示圖片
.showImageOnFail(R.drawable.ic_error)//載入失敗顯示圖片
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();

ImageLoader.getInstance().displayImage(imageUrl,mImageView,options);

滿意請採納

熱點內容
換編程題庫 發布:2024-05-18 18:00:58 瀏覽:561
如何使用伺服器ip直連網站 發布:2024-05-18 18:00:49 瀏覽:431
三星n7100哪個安卓版本好用 發布:2024-05-18 17:55:41 瀏覽:489
萬國覺醒採集腳本源碼 發布:2024-05-18 17:55:39 瀏覽:946
sqlserver加欄位 發布:2024-05-18 17:54:53 瀏覽:927
安卓手機如何清除應用記錄 發布:2024-05-18 17:31:37 瀏覽:639
查看存儲過程許可權 發布:2024-05-18 17:18:33 瀏覽:191
php類self 發布:2024-05-18 17:15:03 瀏覽:894
手機2b2t的伺服器地址是多少 發布:2024-05-18 17:14:56 瀏覽:188
戴爾8490哪個配置比較合理 發布:2024-05-18 17:14:51 瀏覽:168