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

长图优化

现在市面上 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"
 />

代码中

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 不断重绘 onFling , computeScroll 处理惯性问题
  16. invalidate 不断重绘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值