android动态view展开和收起功能,Android实现长图展开与收起效果
前言:
在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实现长图展开与收起效果相关推荐
- 动态短视频壁纸多功能情侣头像,套图等功能微信小程序源码下载
这是一款属于美化类型的小程序吧 里面的内容包含了: 动态视频 静态壁纸 情侣头像 签名套图等等 另外这款小程序目前经过修改已支持多种类型的流量主广告了 如单价较高,比较热门的流量主有: 激励视频 插屏 ...
- android体系结构中每层的功能,Android体系结构
<Android体系结构>由会员分享,可在线阅读,更多相关<Android体系结构(6页珍藏版)>请在人人文库网上搜索. 1.Android 体系结构Android体系结构an ...
- android 动态更新配置文件,基于DX的Android动态更新技术
原标题:基于DX的Android动态更新技术 转自:文/Mob开发者平台 技术副总监 余勋杰 DX简介 安卓程序的主要代码是java 代码,不过由于安卓系统不直接使用sun的jvm,所以从javac编 ...
- 制作android动态壁纸,如何使用LibGDx制作Android动态壁纸?
我想制作 Android动态壁纸.我想使用LibGDx.我发现了这个信息: http://www.badlogicgames.com/wordpress/?p=2652 不幸的是,我的壁纸复制代码,e ...
- android动态脱壳教程,使用 FRIDA 为 Android 应用进行脱壳的操作指南
FortiGuard 实验室最近遇到了很多加壳 Android 恶意软件.这类恶意软件一个很有趣的点是,尽管使用的加壳工具是一样的,但生成的恶意软件却常常会发生变化. 分析加壳工具通常令人望而生畏.因 ...
- android 禁止截屏录屏功能,android 应用禁止截屏录屏
更新记录 1.0.0(2021-02-01) Android 应用禁止截屏录屏 平台兼容性 Android iOS 适用版本区间:4.4 - 11.0 × 原生插件通用使用流程: 购买插件,选择该插件 ...
- android动态view展开和收起功能,TextView实现展开收起的效果
在做Android的过程中,我们经常会遇到TextView显示文本过长的情况,这里我们以开源库ExpandableTextView为例,对其的实现做一讲解: 实现原理描述:expandableText ...
- android 展开收起功能,Android开发实现ListView点击展开收起效果示例
本文实例讲述了Android开发实现ListView点击展开收起效果.分享给大家供大家参考,具体如下: 废话不说先上效果: 实际上这是采用一个ExpandableListView实现的 布局文件很简单 ...
- Android展开悬浮窗功能,Android 悬浮窗 (附圆形菜单悬浮窗)
序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限 2. 构建悬浮窗需要的控件 3. 将控件添加到WindowManager 4. 必要时更新WindowManager的布局 一 ...
最新文章
- C++_泛型编程与标准库(六)
- vue.js中请求数据v-for循环使用数据
- Java 类的一些高级特征
- 【ST表】【单调队列】Window(jzoj 1326)
- jmeter找不到java.dll_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
- Django补充知识点——用户管理
- cmd控制远程电脑运行程序_电脑远程控制怎么,远程桌面开启教程
- 随想录(lua源码学习)
- 数据结构与算法:实验一线性表(字符串分类统计)
- 支付宝集五福下周一开始;iPhone 面世 13 周年;Laravel 6.10.0 发布 | 极客头条
- effective C++ 条款 48:认识template元编程
- 企业网络管理和华为企业级路由交换产品介绍
- html图片幻灯片效果,使用CSS3实现的超酷幻灯图片效果
- 画坦克__线程__V1__第一种方法创造线程
- 利用Proteus仿真基于stm32的智能家居并上传至阿里云
- 【Maya】移动、缩放、旋转、万向节旋转、冻结(未完成)
- 《数据结构与算法之二叉平衡树(AVL)》
- 【话费充值平台】话费充值平台接口设计
- linux下格式化apfs,下一版 macOS High Sierra 将采用 APFS 文件系统
- idea中git代码回滚