前言:

在app的文章中,经常会夹杂着一些特别长的长图。在阅读的时候需要滑动很久才能看图片下方的文字,因此对于长图只展示图片上面一部分,并且可以展开这个功能是很重要的。

效果:

基本思路:

利用scaleType的matrix属性以及直接改变图片的高度来实现图片的收起与展开。

过程:

开始尝试:

scaleType属性介绍:

1.center:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理;

2.centerInside:以原图完全显示为目的,将图片的内容完整居中显示,通过按比例缩小原图的size宽(高)等于或小于ImageView的宽(高)。如果原图的size本身就小于ImageView的size,则原图的size不作任何处理,居中显示在ImageView;

3.centerCrop:以填满整个ImageView为目的,将原图的中心对准ImageView的中心,等比例放大原图,直到填满ImageView为止(指的是ImageView的宽和高都要填满),原图超过ImageView的部分作裁剪处理;

4.matrix:不改变原图的大小,从ImageView的左上角开始绘制原图,原图超过ImageView的部分作裁剪处理;

5.fitCenter:把原图按比例扩大或缩小到ImageView的高度,居中显示;

6.fitEnd:把原图按比例扩大(缩小)到ImageView的高度,显示在ImageView的下部分位置;

7.fitStart:把原图按比例扩大(缩小)到ImageView的高度,显示在ImageView的上部分位置;

8.fitXY:把原图按照指定的大小在View中显示,拉伸显示图片,不保持原比例,填满ImageView

根据以上属性介绍,可以知道matrix属性是我们要的。

基本布局:

android:id="@+id/iv_long_picture"

android:layout_width="match_parent"

android:layout_height="@dimen/dp_146"

android:layout_below="@id/tv_main_content_question"

android:adjustViewBounds="true"

android:scaleType="matrix"

android:src="@color/color_333333" />

android:id="@+id/tv_expand_collapse"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/iv_long_picture"

android:layout_marginBottom="@dimen/dp_16"

android:layout_marginTop="@dimen/dp_10"

android:drawableEnd="@drawable/down_icon"

android:drawablePadding="@dimen/dp_7"

android:text="@string/expand_all"

android:textColor="@color/color_99"

android:textSize="@dimen/sp_14"

android:textStyle="bold"

android:visibility="gone" />

加载图片:

使用Glide加载的图片

Glide.with(this)

.load(mainContentBean.getAccessory().get(0))

.into(ivLongPicture);

点击事件:

直接通过设置imageView的高度来实现图片的展开与收起,

tvExpandCollapse.setOnClickListener(new View.OnClickListener() {

boolean expanded = false;

@Override

public void onClick(View v) {

if (expanded) {

// 收起

ViewGroup.LayoutParams params = ivLongPicture.getLayoutParams();

params.width = RelativeLayout.LayoutParams.MATCH_PARENT;

params.height = DensityUtil.dip2px(MainContentActivity.this, 146);

ivLongPicture.setLayoutParams(params);

expanded = false;

tvExpandCollapse.setText(R.string.expand_all);

tvExpandCollapse.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.down_icon, 0);

scMainContent.smoothScrollTo(0, 0);

} else {

// 展开

ViewGroup.LayoutParams params = ivLongPicture.getLayoutParams();

params.width = RelativeLayout.LayoutParams.MATCH_PARENT;

params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;

ivLongPicture.setLayoutParams(params);

expanded = true;

tvExpandCollapse.setText(R.string.collapse_all);

tvExpandCollapse.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.upper_icon, 0);

}

}

});

遇到问题:

根据以上的思路以及代码实现,普通的长图确实能够做到“展开”和“收起”功能。

但是对于原图宽度超过手机宽度的图片来说,宽度并没有显示完全!

对于Glide版本4.0以上,如果宽度过大,会等比例缩放至宽度等于ImageView的宽度,因此并不会有问题,但是我们的项目用Glide版本是3.7的,而且不容易升级,故此方法不可行。

解决:

查阅了Glide的文档,了解了Glide可以在图片下载完成后对图片进行一些操作,操作完成之后的图片自然就成了ImageView认为的原图了。

因此,可以在加载之前将宽度过大的图片等比例缩放,缩放完成后再加载到ImageView中去。

加载图片改进:

Glide.with(this)

.load(mainContentBean.getAccessory().get(0))

.asBitmap()

.listener(new RequestListener() {

@Override

public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {

return false;

}

@Override

public boolean onResourceReady(Bitmap resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {

int imageWidth = resource.getWidth();

int imageHeight = resource.getHeight();

WindowManager manager = (WindowManager) MainContentActivity.this

.getSystemService(Context.WINDOW_SERVICE);

// 屏幕宽度减去margin值

int width = manager.getDefaultDisplay().getWidth() - DensityUtil.dip2px(MainContentActivity.this, 32);

float scaleRate = width * 1.0f / imageWidth;

//设置matrix

Matrix matrix = new Matrix();

//设置放缩比例

matrix.setScale(scaleRate, scaleRate);

ivLongPicture.setImageMatrix(matrix);

if (imageHeight * scaleRate > DensityUtil.dip2px(MainContentActivity.this, 146)) {

tvExpandCollapse.setVisibility(View.VISIBLE);

} else {

tvExpandCollapse.setVisibility(View.GONE);

}

return false;

}

})

.into(ivLongPicture);

总结:

ImageView的scaleType属性的各个属性值需要了解;

Glide版本之间的差异需要了解;

ImageView如何根据scaleType进行图片切割的需要了解(之后有时间阅读源码);

Glide是一个庞然大物,也是一个很值得学习的框架,需要熟悉掌握(之后有时间阅读源码)

Android的优势在于开源,开源的好处在于易于学习,容易更改。对于开源的框架,仅仅是掌握是不够的,还需要好好的了解框架设计的一些设计模式,框架的优缺点等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android动态view展开和收起功能,Android实现长图展开与收起效果相关推荐

  1. 动态短视频壁纸多功能情侣头像,套图等功能微信小程序源码下载

    这是一款属于美化类型的小程序吧 里面的内容包含了: 动态视频 静态壁纸 情侣头像 签名套图等等 另外这款小程序目前经过修改已支持多种类型的流量主广告了 如单价较高,比较热门的流量主有: 激励视频 插屏 ...

  2. android体系结构中每层的功能,Android体系结构

    <Android体系结构>由会员分享,可在线阅读,更多相关<Android体系结构(6页珍藏版)>请在人人文库网上搜索. 1.Android 体系结构Android体系结构an ...

  3. android 动态更新配置文件,基于DX的Android动态更新技术

    原标题:基于DX的Android动态更新技术 转自:文/Mob开发者平台 技术副总监 余勋杰 DX简介 安卓程序的主要代码是java 代码,不过由于安卓系统不直接使用sun的jvm,所以从javac编 ...

  4. 制作android动态壁纸,如何使用LibGDx制作Android动态壁纸?

    我想制作 Android动态壁纸.我想使用LibGDx.我发现了这个信息: http://www.badlogicgames.com/wordpress/?p=2652 不幸的是,我的壁纸复制代码,e ...

  5. android动态脱壳教程,使用 FRIDA 为 Android 应用进行脱壳的操作指南

    FortiGuard 实验室最近遇到了很多加壳 Android 恶意软件.这类恶意软件一个很有趣的点是,尽管使用的加壳工具是一样的,但生成的恶意软件却常常会发生变化. 分析加壳工具通常令人望而生畏.因 ...

  6. android 禁止截屏录屏功能,android 应用禁止截屏录屏

    更新记录 1.0.0(2021-02-01) Android 应用禁止截屏录屏 平台兼容性 Android iOS 适用版本区间:4.4 - 11.0 × 原生插件通用使用流程: 购买插件,选择该插件 ...

  7. android动态view展开和收起功能,TextView实现展开收起的效果

    在做Android的过程中,我们经常会遇到TextView显示文本过长的情况,这里我们以开源库ExpandableTextView为例,对其的实现做一讲解: 实现原理描述:expandableText ...

  8. android 展开收起功能,Android开发实现ListView点击展开收起效果示例

    本文实例讲述了Android开发实现ListView点击展开收起效果.分享给大家供大家参考,具体如下: 废话不说先上效果: 实际上这是采用一个ExpandableListView实现的 布局文件很简单 ...

  9. Android展开悬浮窗功能,Android 悬浮窗 (附圆形菜单悬浮窗)

    序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限 2. 构建悬浮窗需要的控件 3. 将控件添加到WindowManager 4. 必要时更新WindowManager的布局 一 ...

最新文章

  1. C++_泛型编程与标准库(六)
  2. vue.js中请求数据v-for循环使用数据
  3. Java 类的一些高级特征
  4. 【ST表】【单调队列】Window(jzoj 1326)
  5. jmeter找不到java.dll_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
  6. Django补充知识点——用户管理
  7. cmd控制远程电脑运行程序_电脑远程控制怎么,远程桌面开启教程
  8. 随想录(lua源码学习)
  9. 数据结构与算法:实验一线性表(字符串分类统计)
  10. 支付宝集五福下周一开始;iPhone 面世 13 周年;Laravel 6.10.0 发布 | 极客头条
  11. effective C++ 条款 48:认识template元编程
  12. 企业网络管理和华为企业级路由交换产品介绍
  13. html图片幻灯片效果,使用CSS3实现的超酷幻灯图片效果
  14. 画坦克__线程__V1__第一种方法创造线程
  15. 利用Proteus仿真基于stm32的智能家居并上传至阿里云
  16. 【Maya】移动、缩放、旋转、万向节旋转、冻结(未完成)
  17. 《数据结构与算法之二叉平衡树(AVL)》
  18. 【话费充值平台】话费充值平台接口设计
  19. linux下格式化apfs,下一版 macOS High Sierra 将采用 APFS 文件系统
  20. idea中git代码回滚

热门文章

  1. 信息爆炸式增长与信息化阻碍
  2. 干涩皮肤的解渴神器,水肌美玻尿酸补水保湿面膜
  3. 剑指offer java版 test3—从尾到头打印链表
  4. PyCharm Runtime Error R6034解决方法——补充(彻底解决)
  5. postMessage传递消息详细示例
  6. 注册成为Windows Phone开发者并且解锁Windows Phone 8.1手机
  7. XML编辑软件或工具
  8. Maximum Tape Utilization Ratio
  9. Embedding 编码方法
  10. C++将string转为int