美文网首页安卓资源收集Android开发经验谈最近需要做的
如何优雅地用LayoutParams动态改变view的大小

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

作者: NB一沓 | 来源:发表于2018-07-22 23:52 被阅读92次

    背景描述:有时候我们想在程序运行时修改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不一致的问题。

    相关文章

      网友评论

      • 风无羽:反射会有性能的影响,特别是列表页对性能有极高要求

      本文标题:如何优雅地用LayoutParams动态改变view的大小

      本文链接:https://www.haomeiwen.com/subject/vxnrmftx.html