Android中获取Width和Height的几种方式

释放双眼,带上耳机,听听看~!

简介

view的绘制和Activity的生命周期是没有关系的,如果你在onCreate或者onStart中调用组件的 getWidth/Height, getMeasuredHeight/Width此时获取到的宽和高都是0,因为此时View都没有初始化好,所以获取不到它的宽和高。

获取宽高的方式

onWindowFocusChanged 方法中

onWindowFocusChange是在Activity的焦点发生变化的时候触调,会频繁的调用多次。该方法表明View已经初始化好了可以获取到Width和Height。

  • 模板代码
@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            int measuredHeight = mTvText.getMeasuredHeight();
            int measuredWidth = mTvText.getMeasuredWidth();
            Log.d(TAG, "measureHeight = " + measuredHeight);
            Log.d(TAG, "measureWidth = " + measuredWidth);
            int width = mTvText.getWidth();
            int height = mTvText.getHeight();
            Log.d(TAG, "width = " + width);
            Log.d(TAG, "height = " + height);
        }
    }
view.post(Runnable)

组件通过调用post方法发送一个Runnbale到消息队列的末尾,当Looper执行到这个Runnable,View已经初始化好了,可以获取到宽和高了

  • 模板代码
@Override
    protected void onStart() {
        super.onStart();
        mTvText.post(new Runnable() {
            @Override
            public void run() {
                int onCreateHeight = mTvText.getHeight();
                int onCreateWidth = mTvText.getWidth();
                int measuredWidth = mTvText.getMeasuredWidth();
                int measuredHeight = mTvText.getMeasuredHeight();

                Log.d(TAG, "onCreate: " + onCreateHeight);
                Log.d(TAG, "onCreate: " + onCreateWidth);
                Log.d(TAG, "onCreate: " + measuredWidth);
                Log.d(TAG, "onCreate: " + measuredHeight);
            }
        });
}
ViewTreeObservable

在ViewTreeObservable回调方法中可以获取到View的宽和高,比如使用了OnGlobalLayoutListener这个接口,当View树的状态发生改变获取View树内部的View的可见性发生改变的时候,接口中的onGlobalListener方法将被回调。这是获取View宽高的一个好的时机。

  • 模板代码
@Override
    protected void onStart() {
        super.onStart();
        // 当View树的状态发生改变或者View树内部的View的可见性发生改变时,onGlobalLayout方法将被回调。
        ViewTreeObserver viewTreeObserver = mTvText.getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mTvText.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                int measuredHeight = mTvText.getMeasuredHeight();
                int measuredWidth = mTvText.getMeasuredWidth();
                Log.d(TAG, "onGlobalLayout: " + measuredHeight);
                Log.d(TAG, "onGlobalLayout: " + measuredWidth);
            }
        });
    }

人已赞赏
Android文章

Android 评论框 缩小/放大

2019-10-16 12:38:57

Android文章

Android listview 异步加载图片错位

2019-10-16 18:54:02

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索