編輯:關於Android編程
在這篇文章中,我們分析了Android在對大圖處理時的一些策略——Android異步加載全解析之大圖處理 戳我戳我
那麼在這篇中,我們來對圖像——Bitmap進行一個更加細致的分析,掌握Bitmap的點點滴滴。
URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); is = new BufferedInputStream(conn.getInputStream()); bitmap = BitmapFactory.decodeStream(is);
FileInputStream is = = new FileInputStream(path); bmp = BitmapFactory.decodeFileDescriptor(is.getFD(), null, opts);因此,在調用DiskLruCache來使用的時候,這個方法就可以比decodeFile更快。這裡我們也提供一個完整的調用代碼:
public static OutputStream decodeBitmap(String path) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true;// 設置成了true,不占用內存,只獲取bitmap寬高 BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, 1024 * 800); opts.inJustDecodeBounds = false;// 這裡一定要將其設置回false,因為之前我們將其設置成了true opts.inPurgeable = true; opts.inInputShareable = true; opts.inDither = false; opts.inPurgeable = true; opts.inTempStorage = new byte[16 * 1024]; FileInputStream is = null; Bitmap bmp = null; InputStream ins = null; ByteArrayOutputStream baos = null; try { is = new FileInputStream(path); bmp = BitmapFactory.decodeFileDescriptor(is.getFD(), null, opts); double scale = getScaling(opts.outWidth * opts.outHeight, 1024 * 600); Bitmap bmp2 = Bitmap.createScaledBitmap(bmp, (int) (opts.outWidth * scale), (int) (opts.outHeight * scale), true); bmp.recycle(); baos = new ByteArrayOutputStream(); bmp2.compress(Bitmap.CompressFormat.JPEG, 100, baos); bmp2.recycle(); return baos; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); ins.close(); baos.close(); } catch (IOException e) { e.printStackTrace(); } System.gc(); } return baos; } private static double getScaling(int src, int des) { /** * 目標尺寸÷原尺寸 sqrt開方,得出寬高百分比 */ double scale = Math.sqrt((double) des / (double) src); return scale; }
private Bitmap compressImage(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); //質量壓縮方法,這裡100表示不壓縮,把壓縮後的數據存放到baos中 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; //循環判斷如果壓縮後圖片是否大於100kb,大於繼續壓縮 while (baos.toByteArray().length / 1024 > 100) { //重置baos即清空baos baos.reset(); //這裡壓縮options%,把壓縮後的數據存放到baos中 bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos); //每次都減少10 options -= 10; } //把壓縮後的數據baos存放到ByteArrayInputStream中 ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); //把ByteArrayInputStream數據生成圖片 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap; }
先上預覽圖:流程1.一個勻速圓周運動的點 2.多個勻速圓周運動的點 3.多個圓周運動的點,速度由快到慢 4.點與點之間的間距線性減少,動畫的最後合為一個點 5.為了讓動畫
[Android][Memory Leak] InputMethodManager內存洩露現象及解決 現象: 在特定的機型天語k_touch_v9機型上
ListView雖然使用廣泛,但系統原生的ListView顯然是不能滿足用戶在審美、功能上不斷提高的需求。不過也不要緊,Android完全可以定制化,讓我們非常方便地對原
信自己也是一種信仰。寫在前面的話3月初我在自定義控件概述中挖下的幾個坑,前一段時間已經基本填完了,自定義控件的幾種實現方式也分別寫了demo來進行說明。今天我們來聊一聊