android 获取activity大小,Android中如何正确的在Activity中获取View的宽高

1fe7f969a028

问题:我们的Activity中有一张上面的图片ImageView,现在想测量一下,这个ImageView的宽高尺寸,我们该怎么做呢?

我们要测量一个View的尺寸,那么肯定要在这个View夹在完成之后。由于View的measure过程和Activity的生命周期不是同步执行的,所以在Activity的 onCreate, onStart, onResume生命周期的回调中,我们是无法获取到一个View的准确宽高尺寸的。

那么,我们想要准确的得到一个View的尺寸大小就得用其他的方法了

准确的在Activity中测量一个View的宽高尺寸

Activity / View # onWindowFocusChanged

onWindowFocusChanged此时View已经初始化完毕,当Activity的窗口得到焦点 和失去焦点时均会被调用一次,如果频繁地进行onResume和onPause,那么onWindowFocusChanged也会被频繁地调用。

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

if (hasFocus) {

// 获取View的宽高

int width = view.getMeasuredWidth();

int height = view.getMeasuredHeight();

}

}

view.post(runnable)

通过post可以将一个runnable投递到消息队列的尾部,始化好了然后等待Looper调用次runnable的时候,View也已经初始化好了。

@Override

protected void onStart() {

super.onStart();

view.post(new Runnable() {

@Override

public void run() {

// 获取View的宽高

int width = mTextView.getMeasuredWidth();

int height = mTextView.getMeasuredHeight();

}

});

}

ViewTreeObserver#addOnGlobalLayoutListener

当View树的状态发生改变或者View树内部的 View的可见性发生改变时,onGlobalLayout方法将被回调。因此这是获取View的宽高的一个很好的时机,需要注意:伴随View树状态的改变,这个方法也会被调用多次

@Override

protected void onStart() {

super.onStart();

ViewTreeObserver observer = view.getViewTreeObserver();

observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

// 获取View的宽高

view.getViewTreeObserver().removeOnGlobalLayoutListener(this);

int width = view.getMeasuredWidth();

int height = view.getMeasuredHeight();

}

});

}

view.measure(int widthMeasureSpec , int heightMeasureSpec)

通过手动测量View的宽高,需要根据View的LayoutParams来分不同情况处理

1,match_parent

无法测量出具体的宽高,根据View的测量过程,构造这种measureSpec需要知道parentSize,即父容器的剩下空间,而这个时候我们无法知道parentSize的大小,所以理论上我们不可能测量出View的大小

2,具体的数值

直接makeMeasureSpec固定值,然后调用 view..measure就可以了

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);

int heightMeasureSpec = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);

view.measure(widthMeasureSpec,heightMeasureSpec);

3, wrap_content

在最大化模式下,用View理论上能支持的最大值去 构造MeasureSpec是合理的。

int widthMeasureSpec = MeasureSpec.makeMeasureSpec((1<<30)-1, MeasureSpec.AT_MOST);

int heightMeasureSpec = MeasureSpec.makeMeasureSpec((1<<30)-1, MeasureSpec.AT_MOST);

view.measure(widthMeasureSpec,heightMeasureSpec);

关于View测量的一个工具类

import android.view.View;

import android.view.ViewGroup;

import android.view.ViewTreeObserver;

/**

*

* 描述: 布局参数设置工具类

*

**/

public class LayoutParamerUtils {

/**

*

* 描述: 获取 指定view 的 viewTreeObserver

* created: 2018/6/14/014 18:49

*

**/

public static void getViewObserver(final View viewtest, final ViewObserverListener viewObserverListener) {

if(viewtest == null){

return;

}

viewtest.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){

@Override

public void onGlobalLayout() {

viewtest.getViewTreeObserver().removeOnGlobalLayoutListener(this);

if(viewObserverListener != null){

viewObserverListener.onViewObserverResult();

}

}

});

}

/**

*

* 描述: getViewObserver 回调接口

* created: 2018/6/14/014 18:54

*

**/

public interface ViewObserverListener{

void onViewObserverResult();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值