Android中获取控件宽高的4种方法集合

 更新时间:2018年02月05日 10:36:27   作者:徐风来  
下面小编就为大家分享一篇Android中获取控件宽高的4种方法集合,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

借鉴自开发艺术

1.onWindowFocusChanged

这个方法会被调用多次,在View初始化完毕后会调用,当Activity的窗口得到焦点和失去焦点都会被调用一次(Activity继续执行和暂停执行时)。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);
  if (hasFocus) {
    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
  }
}

2.view.post

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ViewGroup root = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.activity_main, null, false);
  setContentView(root);
  final View view = root;
  view.post(new Runnable() {
    @Override
    public void run() {
      int width = view.getMeasuredWidth();
      int height = view.getMeasuredHeight();
      Log.i(TAG, width + " " + height);
    }
  });
}

具体原理暂时还不懂,不过应该是view封装的异步回调初始化后,view的测绘多半也完成了,这是一个同步的过程。所以才可以接收到消息。

3.ViewTreeObserver

他有许多回调。比如当View树的状态发生改变或者View树内部的View可见性发现改变时,onGlobalLayout方法将被回调。

final View view = root;
ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
  @Override
  public void onGlobalLayout() {
    view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
    Log.i(TAG, width + " " + height);
  }
});

通过一种增加global listener又移除的方式,获取观察而来的消息。

4.view.measure

手动测绘,分3种情况:

一、match_parent

这个情况是获取不到的。构造这种情况的MeasureSpec需要知道父容器的剩余空间。

二、具体的数值(dp/px)

比如宽高都是100px,可以这样做:

View view = root;
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
view.measure(widthMeasureSpec, heightMeasureSpec);
Log.i(TAG, widthMeasureSpec + " " + heightMeasureSpec);

到这里为止了,这种方法不推荐,因为测出来发现有错误。

以上这篇Android中获取控件宽高的4种方法集合就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决TabLayout 不显示下划线问题

    解决TabLayout 不显示下划线问题

    这篇文章主要介绍了解决TabLayout 不显示下划线问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Android 使用腾讯X5浏览器上传图片的示例

    Android 使用腾讯X5浏览器上传图片的示例

    这篇文章主要介绍了Android 使用腾讯X5浏览器上传图片的示例,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-04-04
  • Android Flutter实现自定义下拉刷新组件

    Android Flutter实现自定义下拉刷新组件

    在Flutter开发中官方提供了多平台的下拉刷新组件供开发者使用。本文将改造一下这些组件,实现自定义的下拉刷新组件,感兴趣的可以了解一下
    2022-08-08
  • Android打印机--小票打印格式及模板设置实例代码

    Android打印机--小票打印格式及模板设置实例代码

    这篇文章主要介绍了Android打印机--小票打印格式及模板设置实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Kotlin协程之Flow的使用与原理解析

    Kotlin协程之Flow的使用与原理解析

    Flow是一种数据流,可以用于协程间的通信,具有冷、懒、响应式等特点,Flow是基于协程构建的,可以提供多个值,本文就来给大家讲讲Kotlin Flow使用与原理,需要的朋友可以参考下
    2023-09-09
  • Android 中raw和assets文件夹的区别

    Android 中raw和assets文件夹的区别

    这篇文章主要介绍了Android 中raw和assets文件夹的区别的相关资料,需要的朋友可以参考下
    2017-04-04
  • Room Kotlin API的使用入门教程

    Room Kotlin API的使用入门教程

    这篇文章主要介绍了Room Kotlin API使用入门教程,帮助大家更好的理解和学习使用并且测试 Room Kotlin API,感兴趣的朋友可以了解下
    2021-04-04
  • Jetpack navigation组件超详细讲解

    Jetpack navigation组件超详细讲解

    首先Navigation是一个架构组件,因为切换Activity是一个Binder通信的过程,所以Activity是属于比较重的组件。而Fragment的切换其实只是View的切换,比较轻量级。因此单Activity加Fragment切换成为了比较常见的架构方式
    2022-10-10
  • Android中ImageCropper矩形、圆形 裁剪框的实现方法

    Android中ImageCropper矩形、圆形 裁剪框的实现方法

    这篇文章主要给大家介绍了关于Android中ImageCropper矩形、圆形 裁剪框的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2018-07-07
  • AndroidStuio插件开发适用于jetbrains全家桶

    AndroidStuio插件开发适用于jetbrains全家桶

    这篇文章主要介绍了AndroidStuio插件开发适用于jetbrains全家桶,本文通过实例给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论