性能优化(四)长图优化,仿微博加载长图方式
长图优化
现在市面上 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.BigViewandroid: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);//加载 InputStreambigView.setImage(InputStream is)//加载网络图片 callBack : 加载中的回调bigView.setNetUrl(String url,LoadNetImageCallBack callBack);
效果对比
微博长图效果
仿照微博预览长图效果
效果是不是很丝滑,原图是 12 M 压缩后不到 2 M ,加载前可以压缩下
内存使用状态
内存无泄漏,无抖动,无溢出 。这里在提一下如果对内存优化不了解的可以看下之前的文章
Java 堆内存: 5 - 6 M 之间
Native 占用内存: 25 M 左右
解决思路
粗略步骤:
- 沿着对角线缩放
- 加载屏幕能够看见的区域
- 复用上一个 bitmap 区域的内存
- 处理滑动
详细步骤
- 定义 Rect 图片需要加载的区域
- 定义图片复用 BitmapFactory.Options()
- 定义手势识别GestureDetector 上下左右滑动的帮助类
- 定义一个滑动帮组类 Scroller
- 加载图片信息并不是加载真正的图片
- 开启内存复用功能
- 创建一个区域解码器,只解码一部分。
- 刷新 requestLayout
- 确定加载图片的区域,计算缩放比列
- onDraw绘制区域图片
- 将图片区域缩放得到 View 的大小
- drawBitmap 绘制图片
- 处理滑动事件交给手势处理
- 随着手指滑动改变现实区域Rect,判断头部底部界限
- invalidate 不断重绘 onFling , computeScroll 处理惯性问题
- invalidate 不断重绘
性能优化(四)长图优化,仿微博加载长图方式相关推荐
- Android加载长图,仿微博长图滚动查看
/** * Created by sunrui on 2017/3/8. * 加载长图片 * 解决步骤 * 1.将图片缩放到与控件等宽 * 2.判断缩放后的图片高度,如果高度大于控件高度较多(这里设置 ...
- 自定义动画(仿Win10加载动画)——优化
此为前文章写的仿Win10加载动画的优化版 源代码 已更新到github 优化分析 原生 自定义高仿(v1版) 一直觉得自己写的与原生的有差别,经过仔细对比观察,发现: 原生的圆点出发位置不是都在底部 ...
- 前端性能优化的重要方案:图片懒加载
大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的前端性能优化的重要方案:图片懒加载,主要包括其原理,我们常用的一些插件,及编写源码实现图片懒加载功能等,图片懒加载是项目比较常见的 ...
- Android加载超长图(微博长图)
对于一些需要加载超长图需求的同学,可能一开始使用使用bitmap或者inputstream转bitmap(或类似加载库)会发现出现图片太大加载不出来的问题(其实我也是遇到了这个问题ヽ(≧Д≦)ノ).解 ...
- android开发 加载大图,Android加载超长图(微博长图)
对于一些需要加载超长图需求的同学,可能一开始使用使用bitmap或者inputstream转bitmap(或类似加载库)会发现出现图片太大加载不出来的问题(其实我也是遇到了这个问题ヽ(≧Д≦)ノ).解 ...
- 安卓设置菊花动画_Android仿ios加载loading菊花图效果
项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loading,一般用的比较多的是仿照ios 的菊花加载loading 图,当然一些条件下还会涉及到加载成功/ 失败情况 ...
- Android之SubsamplingScaleImageView加载长图不能放缩问题
1 问题 第三方开源框架用了这个第三方开源框架(SubsamplingScaleImageView)加载长图,但是源代码在有些手机上面不能进行放缩. private void displayLongP ...
- android如何加载长图
思路:那就是对于一张巨型图片我们可否每次指定一块区域加载显示,然后通过改变这个区域完成整张巨图的加载呢?这样内存中只有完整图片的一块区域. 区域加载 1.BitmapRegionDecoder 指定B ...
- android加载长图宽度自适应,Android使用Glide加载超长图
app项目开发过程中,大都有查看图片详情的功能模块.实现的方式一般都是通过viewpager+photoView+Glide的方式.这种方式下,如果碰到加载超长图,比如说高清版的清明上河图/世界地图, ...
最新文章
- 剑破冰山—Oracle开发艺术 书评(by ora-600)
- 企业网站外链发布有技巧
- Python输出黄金分隔数列前n项。 黄金分隔数列由Fibonacci数列相邻两项之比组成:1/1,1/2,2/3,3/5,5/8,...其取值逐渐接近黄金分隔数。
- Bit-Z全球生态联盟暨韩国战略发布会即将开启
- c语言知道坐标求线段长度,C语言编写程序:输入任意3线段的长度,判断组成三角形的种类...
- spring三种注入方式
- Matrix 高斯消元Gaussian elimination 中的complete pivoting和partial pivoting
- Linux Hugetlbfs内核源码简析-----(二)Hugetlbfs挂载
- azure云数据库_保护Azure SQL数据库免于意外删除
- ES6模块的循环加载
- NASA、西门子和大众都在用的 IoT 协议可遭滥用
- Error: Invalid or corrupt
- 组织结构流程图模板分享
- Typecho博客主题 - Joe主题再续前缘版
- mysql启动黑屏_红警win10黑屏和不显示菜单栏问题 只有声音没有图像的解决
- 类似于萝卜书摘的书摘app推荐
- vue2 provide和inject的使用
- EPICS教程1 -- 在Linux/UNIX/DARWIN(MAC)上安装
- 安得广厦千万间,大赚天下寒士俱欢颜
- nginx 通过路径分发 网站/端口/服务