性能優化 (五) 長圖優化,仿微博加載長圖方式

性能優化系列

APP 啓動優化java

UI 繪製優化android

內存優化git

圖片壓縮github

長圖優化算法

電量優化性能優化

Dex 加解密網絡

動態替換 Applicationapp

APP 穩定性之熱修復原理探索maven

APP 持續運行之進程保活實現post

ProGuard 對代碼和資源壓縮

APK 極限壓縮

長圖優化

如今市面上 95 % 以上,APP 都有預覽圖片的功能,那麼是怎麼作的勒,今天咱們就來仿照 微博 預覽長圖,來對長圖優化。

怎麼使用

代碼傳送陣

  1. project/build.gradle

    allprojects {
    		repositories {
    			...
    			maven { url 'https://jitpack.io' }
    		}
    	}
    複製代碼
  2. app/build.gradle

    dependencies {
    	        implementation 'com.github.yangkun19921001:long_picture_view:1.0.2'
    	}
    複製代碼
  3. xml 中直接使用

    <com.yk.big_picture_library.BigView
            android:id="@+id/bv_img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
     />
    複製代碼
  4. 代碼中

    BigView bigView=findViewById(R.id.bv_img);
     //加載路徑
     bigView.setImage(BIG_IMAGE_PAHT);
     //加載 InputStream
     bigView.setImage(InputStream is)
     //加載網絡圖片 callBack : 加載中的回調
     bigView.setNetUrl(String url,LoadNetImageCallBack callBack);
    複製代碼

效果對比

微博長圖效果

仿照微博預覽長圖效果

效果是否是很絲滑,原圖是 12 M 壓縮後不到 2 M ,加載前能夠壓縮下,我用的是我本身的另外一個圖片壓縮開源項目利用哈夫曼算法對圖片壓縮。

內存使用狀態

內存無泄漏,無抖動,無溢出 。這裏在提一下若是對內存優化不瞭解的能夠看下性能優化(三)...

Java 堆內存: 5 - 6 M 之間

Native 佔用內存: 25 M 左右

解決思路

粗略步驟:

  1. 沿着對角線縮放
  2. 加載屏幕可以看見的區域
  3. 複用上一個 bitmap 區域的內存
  4. 處理滑動

詳細步驟

  1. 定義 Rect 圖片須要加載的區域
  2. 定義圖片複用 BitmapFactory.Options()
  3. 定義手勢識別 GestureDetector 上下左右滑動的幫助類
  4. 定義一個滑動幫組類 Scroller
  5. 加載圖片信息並非加載真正的圖片
  6. 開啓內存複用功能
  7. 建立一個區域解碼器,只解碼一部分。
  8. 刷新 requestLayout
  9. 肯定加載圖片的區域,計算縮放比列
  10. onDraw 繪製區域圖片
  11. 將圖片區域縮放獲得 View 的大小
  12. drawBitmap 繪製圖片
  13. 處理滑動事件交給手勢處理
  14. 隨着手指滑動改變現實區域 Rect,判斷頭部底部界限
  15. invalidate 不斷重繪
  16. onFling , computeScroll 處理慣性問題
  17. invalidate 不斷重繪
相關文章
相關標籤/搜索