Android控件设置宽高比的方法

 更新时间:2018年02月22日 10:24:09   作者:WolfXu  
本篇文章主要介绍了Android控件设置宽高比的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

0. 困扰很久的问题

Android控件的宽和高保持比例,这是从我接触Android以来,一直不断会遇到的需求。以前,要么就是在代码里直接设置宽和高,要么就是自定义控件。网上也有开源的自定义ViewGroup,可以让其子View比较方便的设置宽和高的比例。但这些实现方式,还是比较麻烦,也不够直观。直到有了DataBinding,我们可以很方便地给控件加上自定义的属性,也就可以很方便的在布局文件中设置控件的宽高比了。

1. 如何实现

通过BinderAdapter为所有View绑定下面的方法,当设置widthHeightRatio属性时,会调用下面这个方法。这个有点AOP的意思,我们针对所有的View做了处理。

public class DataBindingAdapters {
  // 根据View的高度和宽高比,设置高度
  @BindingAdapter("widthHeightRatio")
  public static void setWidthHeightRatio(final View view, final float ratio) {
    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        int height = view.getHeight();
        if (height > 0) {
          view.getLayoutParams().width = (int) (height * ratio);
          view.invalidate();
          view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
      }
    });
  }
}

我们在获取到控件的高度后,根据比例计算宽度,然后设置给控件。这里注册了OnGlobalLayoutListener,是因为控件的高度有可能还没计算完成。在获取到高度之后,移除监听,避免多余的调用。

<ImageView
  android:layout_width="120dp"
  android:layout_height="match_parent"
  app:widthHeightRatio="@{1}"/>

然后我们就可以在布局文件中直接设置宽高比了。这个布局文件必须使用DataBinding,也就是最外层要用layout标签。属性值必须加上@{},不然是按普通属性处理的,不会调用我们的方法,编译时会因为找不到属性报错。当然,这个属性只能根据高度计算宽度,如果要根据宽度计算高度,可以用同样的方式再加一个属性。

2. 原理简析

其实在编译后的layout文件中是没有我们加的属性的(编译后的layout文件在build/intermediates/data-binding-layout-out下面可以看到)。真正设置这个属性,还是在Java代码中直接调用了我们绑定的方法。在DataBinding自动生成的Binding类中,可以发现有类似下面这样的调用。

复制代码 代码如下:

DataBindingAdapters.setWidthHeightRatio(this.mboundView0, cardWidthHeightRatio);

这里只是做一个简单的解释,至于在什么时机会触发这行代码,敬请期待我后续的文章。

3. BinderAdapter的其他妙用

ImageView自动加载网络图片

@BindingAdapter({"android:src", "error"})
public static void setImageUrl(ImageView view, String url, @DrawableRes int errorImage) {
  if (!TextUtils.isEmpty(url)) {
    // 封装好的图片加载工具
    ImageManager.from(view.getContext()).displayImage(view, url, errorImage);
  } else {
    view.setImageResource(errorImage);
  }
}

直接在布局文件中设置要加载的图片的url,和加载失败时显示的默认图。

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

相关文章

  • Android自定义View实现左右滑动选择出生年份

    Android自定义View实现左右滑动选择出生年份

    这篇文章主要介绍了Android自定义View实现左右滑动选择出生年份,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android Widget 桌面组件开发介绍

    Android Widget 桌面组件开发介绍

    本篇文章主要介绍了Android中的 widget 桌面组件开发教程,对AppWidget 框架以及AppWidgetManger类进行详细讲解,开发Android widget 开发的朋友可以参考下
    2016-07-07
  • Android中的Coroutine协程原理解析

    Android中的Coroutine协程原理解析

    这篇文章主要介绍了Android中的Coroutine协程原理解析,本文将会围绕挂起与恢复彻底剖析协程的实现原理,包括Kotlin函数基础知识复习,关于函数的个人经验总结,需要的朋友可以参考下
    2022-03-03
  • Android实现自动挂断电话功能的示例代码

    Android实现自动挂断电话功能的示例代码

    在开发Android应用时,有时会遇到需要实现自动挂断电话的需求,本文将详细介绍一下如何在Android中实现自动挂断电话的功能,需要的小伙伴可以参考一下
    2025-04-04
  • Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    这篇文章主要介绍了Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗的相关资料,需要的朋友可以参考下
    2016-07-07
  • 详解Flutter如何绘制曲线,折线图及波浪动效

    详解Flutter如何绘制曲线,折线图及波浪动效

    这篇文章主要为大家介绍线条类图形的绘制(正弦曲线、折线图),并且结合 Animation 实现了常见的波浪动效,感兴趣的小伙伴可以了解一下
    2022-03-03
  • Android图片采样缩放功能实例代码

    Android图片采样缩放功能实例代码

    是为了更加高效的加载Bitmap。所以我们需要把android中的图片进行采样缩放,下面小编给大家分享Android图片采样缩放功能实例代码,需要的朋友参考下吧
    2017-11-11
  • 解析Android开发优化之:软引用与弱引用的应用

    解析Android开发优化之:软引用与弱引用的应用

    Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用,本篇文章重点介绍一下软引用和弱引用
    2013-05-05
  • 教你五分钟实现Android超漂亮的刻度轮播控件实例教程

    教你五分钟实现Android超漂亮的刻度轮播控件实例教程

    说到轮播图,想必大家都不陌生,下面这篇文章主要给大家介绍了关于如何利用五分钟快速实现一款超漂亮的Android刻度轮播控件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-09-09
  • Android中RecyclerView嵌套滑动冲突解决的代码片段

    Android中RecyclerView嵌套滑动冲突解决的代码片段

    这篇文章主要为大家详细介绍了Android中RecyclerView嵌套滑动冲突解决的代码片段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论