博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android动态imageview大小,如何优雅地用LayoutParams动态改变view的大小
阅读量:5009 次
发布时间:2019-06-12

本文共 1278 字,大约阅读时间需要 4 分钟。

背景描述:有时候我们想在程序运行时修改view的大小,举个例子:

下面是一个imageView,我们动态地设置一张bitmap进去,如果bitmap的宽长比和imageView的宽长比不一样,ImageView就会出现黑边现象,见下图:-(

db358fcd227f

QQ浏览器截图20180722230920.png

如果我们改变ImageView的高度,使得其宽长比=bitmap的宽长比黑边就会消失,实际项目需求中,bitmap资源往往来自网络加载,而且每次加载Bitmap不同,其宽长比也会变化,为了去除imageView的黑边,我们需要动态改变image的宽高

。下面是效果图

db358fcd227f

change.gif

上代码

CollapsingToolbarLayout.LayoutParams layoutParams=new CollapsingToolbarLayout.LayoutParams(1080,getBitmapHeight(bitmap));

imageView.setLayoutParams(layoutParams);

代码分析:

先要知道我们要改变大小的view在什么布局里面(LinearLayout,Relativelayout,...),然后new 相应的layoutParams

这里我们的imageView在CollapsingToolbarLayout里面,所以要new CollapsingToolbarLayout.LayoutParams;

我们可以传入/修改不同的宽高参数来控制view的大小。

优化(本文重点)

不得不说上边的过程还是很麻烦的,当LayoutParams类型不对时程序分分钟抛出异常,而且每次都要去布局里面找相应的父布局,然后才能生成相应的LayoutParams对象。

优化方法:使用反射生成view相对应的LayoutParams对象。

我们先看一张图

db358fcd227f

QQ浏览器截图20180722233627.png

从官网上看所有的LayoutParams都是ViewGroup.LayoutParams的子类。

反射LayoutParams代码:

Class extends ViewGroup.LayoutParams> LayoutParamsClass=imageView.getLayoutParams().getClass();

imageView.setLayoutParams( LayoutParamsClass.getDeclaredConstructor(int.class,int.class).newInstance(1080,getBitmapHeight(bitmap));

分析:

imageView.getLayoutParams().getClass()拿到类名,getDeclaredConstructor调用其有参数的构造方法,newInstance来生成对象

这样没们就用反射绕过了实例化 LayoutParams时 可能出现的 与父view的LayoutParams不一致的问题。

转载地址:http://vqggp.baihongyu.com/

你可能感兴趣的文章
团队个人冲刺第三天
查看>>
unit
查看>>
2017-10-17 NOIP模拟赛2
查看>>
How to install ia32-libs in Ubuntu 14.04 LTS (Trusty Tahr)
查看>>
ACM/ICPC 之 模拟 (HNUOJ 13391-换瓶模拟)
查看>>
JavaWeb学习——JSP基础
查看>>
Eclipse tomcat server 无法添加项目
查看>>
黑寡妇黄飞鸿
查看>>
leetcode 217 Contains Duplicate 数组中是否有重复的数字
查看>>
The Ctrl & CapsLock `problem'
查看>>
MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
查看>>
linux故障判断
查看>>
Leetcode 23. Merge k Sorted Lists(python)
查看>>
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>
face detection[HR]
查看>>
java性能调优工具
查看>>
C# 其他的Url 文件的路径转化为二进制流
查看>>
cmake使用
查看>>
ios7上隐藏status bar
查看>>