性能优化 (五) 长图优化,仿微博加载长图方式

性能优化系列

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 不断重绘
相关文章
相关标签/搜索