圖片無限放大,不模糊,圖片移動,仿微信圖片放大
備忘:本文關鍵內容是“OOM(Out Of Memory)異常",跟 “移動時的截圖起點規則”內容,其他部分沒看也可以看的懂
寫此程式背景
看到微信的圖片瀏覽的強大功能,於是自己寫了一個。原則上可以無限放大,但是放大部分像素必須有原圖片的1個像素,最小也不能小於1*1 像素。
思路:
功能解剖:
縮放:微信的縮放能縮放到使用者滿意的範圍。(放大不會超過max倍,縮小不會超過min)
移動:當圖片高與寬小於螢幕時,能移動圖 片到任意位置。當高或寬大於螢幕時,移動圖片則會截取圖片某一模組放大滿屏顯示。
最重要的一點就是圖片放大時看不出來圖片變模糊
解剖雛形:
假設用系統內建 Matrix函數來控制放大縮小。
縮小: 可以縮小很小倍,當不易控制倍數(如1.25倍,但Matrix不會那麼精確)
放大:但放大超出螢幕時,Bitmap.createBitmap會在記憶體 中建立一個很大的圖(或記憶體超出系統設定的值或寬高超出螢幕),導致顯存或記憶體不足。
因為上條放大會出現問題所以本方案絕對不行。
解剖過度:
那麼要有那麼一 種縮放方法滿足下麵條件
一、能幾乎精確的縮小到某一個倍數
二、放大時記憶體不會溢出
基於縮放的截取方法想出以下移動方案
一、當放大時移動時計算某個參 考點在圖上移動的位置所佔比列(x,y),高寬為螢幕高度/倍數
二、當縮小的圖在螢幕範圍之內,那麼移動的效果通過移動ImageView的位置實現
方案:因為縮放的關鍵是放大 ,所以可以考慮放大時用截取一段圖*n倍不會溢出的圖
截圖方案: 一、看到截取就想到用畫布canvas解決(於是建立了一個MyBitMap類)能截永遠不會記憶體溢出的放大圖。並且映像不 會模糊(canvas優秀之處)。
補充:OOM(Out Of Memory)異常
1.放大時不模糊的實現:利用canvas擷取放大後的圖,就能解決安常規放大後模糊的現狀。
2.圖片不 溢出的實現:在canvas放大時限制圖片的大小不超出螢幕就行。