教你如何循环显示超长图片
来源:互联网 发布:js生成表格代码 编辑:程序博客网 时间:2024/04/28 01:19
【原文地址点击打开链接】
简介
某次被问到如何实现一个滚筒状的控件,就是可以将一张很长的图片沿着Y轴无限旋转,如下图所示:
大概就是这个意思,当时还不知道图片可以裁剪,想不出整个流程怎么搞,后来得知Bitmap有裁剪功能,才想到这个功能怎么实现,花了一下午时间整了一下有了成果。
这是这张长图:
然后旋转起来就是这个样子:
上面这个效果在实际运行过程中是非常流畅的,这张图片是按照每秒几帧截的,所以看起来一顿一顿的。
先来说说如何实现:
第一次:先按照屏幕的宽度截取这张长图的起始部分。
第二次:以偏移量开始,重复第一次的行为。
…
最后:当这张图片的结尾部分不足以支撑整个屏幕的宽度时,先截取这张图片的末尾部分,绘制。然后再以剩余的宽度截取图片的头部部分,绘制。依次进行,直至重新回到第一次。
以上是 CylinderImageView 的实现代码。
其中有两个公开方法:
resume() 用于在 Activity的onResume() 中调用,以便暂停。
pause() 用于在Activity的onPause() 中调用,以便恢复旋转。
下面是使用示例:
因为这个控件内部涉及大量的图片操作,所以大伙一定很关心内存的使用。我为此专门做了内存测试,结果内存占用非常小。
这张图是 没有使用CylinderImageView 时应用程序所占用的内存 17.9MB:
我这里所使用的示例图片的长宽是 1200x353,也就是说它被加载到内存中所占用的内存大小是 1200x353x4/1024/1024=1.61MB。
再加上在屏幕上所显示的Bitmap所占用的内存为:2080x353x4/1024/1024=1.45MB。
因为内存回收并不是实时的,所以在内存使用最高峰时,所使用的内存:17.9+1.61+1.45x2=22.43MB。
实际的运行占用内存为:
以及:
上面两张图片的差距是图片内存回收的差值,但是这里的高峰内存值与我们计算的内存值有些差距,这是因为除了内存之外,我们还在XML布局文件中声明了控件以及加载控件也占用了一定的内存空间。
调用 pause() 方法的内存状况:
调用 resume() 方法的内存状况:
以及:
Activity销毁之后所占用的内存:
通过上面一系列图示说明这个控件将内存的消耗控制在了合理的范围之内,没有滥用内存。
最后,大功告成,不知道是否明白我说的呢?
大家可以点击最后 阅读原文 查看源码地址。
- 教你如何循环显示超长图片
- 教你如何循环显示超长图片
- 如何实现一个循环显示超长图片的控件
- 如何实现一个循环显示超长图片的控件
- 教你如何使用libpng显示png图片
- 教你如何使用libpng显示png图片
- 教你如何HTML显示一张图片的一部分
- 如何解决LSTM循环神经网络中的超长序列问题
- MATLAB 如何循环显示多张图片在一个窗口
- 循环显示图片
- 图片循环渐变显示
- 循环不断显示图片
- 循环显示图片
- 图片循环显示
- 循环显示图片
- 如何让你的Android显示gif格式的图片
- 如何让你的 Android 显示gif格式的图片
- 文字超长省略显示
- 输出到同一行;进度条
- 使用ValueAnimator实现数字增长效果
- Android应用开发性能优化完全分析
- Get value from agent failed: cannot connect to [[192.168.186.130]:10050]: [113]No route to host
- 针孔模型以及投影矩阵
- 教你如何循环显示超长图片
- leetcode 180. Consecutive Numbers
- 架构探险-从零开始写Javaweb框架读书笔记(3)
- POJ 2182 Lost Cows(树状数组+二分)
- 人脸识别技术
- 格式化输出
- Storm学习----ACK机制
- Android数据库新王者-Realm入门教程
- synchronized与ReentrantLock的介绍、使用、适合场景及比较