如何优雅地用LayoutParams动态改变view的大小

背景描述:有时候我们想在程序运行时修改view的大小,举个例子:
下面是一个imageView,我们动态地设置一张bitmap进去,如果bitmap的宽长比和imageView的宽长比不一样,ImageView就会出现黑边现象,见下图:-(


QQ浏览器截图20180722230920.png

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


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对象。

我们先看一张图


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不一致的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,216评论 25 709
  • 《心灵故事》墨子的“交相利”概括了亚当.斯密《国富论》的精髓:即合作比不合作好。商会是人类最神圣的组织之一,它促进...
    石高宏阅读 1,761评论 0 1
  • 点滴 泪,纵横于沟壑 飘洒于心田 滋润于胸中 ...
    waitingfor_b0f0阅读 1,345评论 0 0
  • 昨晚吃完晚饭,去看的这部电影。19:45的场,六点钟买票,竟然只剩最后一排最边上的座位了,可怜了我和先生两个近视眼...
    数歌阅读 3,093评论 0 2
  • 都说一个人不经历一些事情就会成长的很慢,不犯一些错误或遭遇一些人生的挫折就是一种缺憾,特别对于一个男人来说...
    风雨怎能陌路阅读 1,124评论 0 0