編輯:關於Android編程
public class ImageFileCache { private static final String TAG = "ImageFileCache"; //圖片緩存目錄 private static final String IMGCACHDIR = "/sdcard/ImgCach"; //保存的cache文件寬展名 private static final String CACHETAIL = ".cach"; private static final int MB = 1024*1024; private static final int CACHE_SIZE = 1; //當SD卡剩余空間小於10M的時候會清理緩存 private static final int FREE_SD_SPACE_NEEDED_TO_CACHE = 10; public ImageFileCache() { //清理部分文件緩存 removeCache(IMGCACHDIR); } /** * 從緩存中獲取圖片 */ public Bitmap getImageFromFile(final String url) { final String path = IMGCACHDIR + "/" + convertUrlToFileName(url); File file = new File(path); if (file != null && file.exists()) { Bitmap bmp = BitmapFactory.decodeFile(path); if (bmp == null) { file.delete(); } else { updateFileTime(path); Logger.d(TAG, "get bmp from FileCache,url=" + url); return bmp; } } return null; } /** * 將圖片存入文件緩存 */ public void saveBitmapToFile(Bitmap bm, String url) { if (bm == null) { return; } //判斷sdcard上的空間 if (FREE_SD_SPACE_NEEDED_TO_CACHE > SdCardFreeSpace()) { //SD空間不足 return; } String filename = convertUrlToFileName(url); File dirFile = new File(IMGCACHDIR); if (!dirFile.exists()) dirFile.mkdirs(); File file = new File(IMGCACHDIR +"/" + filename); try { file.createNewFile(); OutputStream outStream = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream); outStream.flush(); outStream.close(); } catch (FileNotFoundException e) { Logger.d(TAG, "FileNotFoundException"); } catch (IOException e) { Logger.d(TAG, "IOException"); } } /** * 計算存儲目錄下的文件大小, * 當文件總大小大於規定的CACHE_SIZE或者sdcard剩余空間小於FREE_SD_SPACE_NEEDED_TO_CACHE的規定 * 那麼刪除40%最近沒有被使用的文件 */ private boolean removeCache(String dirPath) { File dir = new File(dirPath); File[] files = dir.listFiles(); if (files == null) { return true; } if (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { return false; } int dirSize = 0; for (int i = 0; i < files.length; i++) { if (files[i].getName().contains(CACHETAIL)) { dirSize += files[i].length(); } } if (dirSize > CACHE_SIZE * MB || FREE_SD_SPACE_NEEDED_TO_CACHE > SdCardFreeSpace()) { int removeFactor = (int) (0.4 * files.length); Arrays.sort(files, new FileLastModifSort()); for (int i = 0; i < removeFactor; i++) { if (files[i].getName().contains(CACHETAIL)) { files[i].delete(); } } } if (SdCardFreeSpace() <= CACHE_SIZE) { return false; } return true; } /** * 修改文件的最後修改時間 */ public void updateFileTime(String path) { File file = new File(path); long newModifiedTime = System.currentTimeMillis(); file.setLastModified(newModifiedTime); } /** * 計算SD卡上的剩余空間 */ private int SdCardFreeSpace() { StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); double sdFreeMB = ((double)stat.getAvailableBlocks() * (double) stat.getBlockSize()) / MB; return (int) sdFreeMB; } /** * 將url轉成文件名 */ private String convertUrlToFileName(String url) { return url.hashCode() + CACHETAIL; } /** * 根據文件的最後修改時間進行排序 */ private class FileLastModifSort implements Comparator{ public int compare(File file0, File file1) { if (file0.lastModified() > file1.lastModified()) { return 1; } else if (file0.lastModified() == file1.lastModified()) { return 0; } else { return -1; } } } }
說明:上述代碼很好理解而且都有注釋,不用多說了。
到這裡,整個banner體系的代碼都被介紹了,希望代碼中的思想能夠對大家有所啟發,謝謝大家的捧場!
我是完全根據這裡仿制了一個作為備忘,可以點擊這裡查看原始版本代碼如下:1、res/values/attrs.xml 2、具體實現 publ
Android自身可以實現代碼的混淆功能,Android集成了代碼混淆的功能,這些功能在Android SDK的tools有個proguard目錄,這個目錄下就是提供了A
移動大王卡怎麼購買、移動大王卡怎麼激活呢?下面小編分享一下移動大王卡購買鏈接,一起來看看吧。 移動大王卡怎麼購買? 通過山東移動掌廳申請,點擊&
由於最近參加一個比賽需要用到人臉識別,但賽方限制使用第三方服務商提供的API雲服務調用,因此想到了使用javacv來實現,但通過百度、google搜索發現所有的教程都是在