热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学会这两招,长图优化不求人

长图优化现在市面上95%以上,APP都有预览图片的功能,那么是怎么做的勒,今天我们就来仿照微博预览长图,来对长图优化。怎

长图优化

现在市面上 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 中直接使用


4.代码中

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 左右

解决思路

粗略步骤:

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 不断重绘


推荐阅读
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 阅读spring5源码DefaultSingletonBeanRegistry类遇到问题发现SpringBean中存在大量回调机制和aware接口,于是特意去了解 ... [详细]
  • Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注【程序新视界】。本篇为面试题系列第2篇。常见面试问 ... [详细]
author-avatar
喝咖啡的小南瓜_488
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有