您的位置:首页 > 其它

动态获取控件宽高的四种方式

2016-11-14 22:57 190 查看

1.通过View的监听树

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int height = view.getHeight();
int width = view.getwidth();
logD("topH=" + topH);
//移除监听
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});


2.申请测量View

view.measure(0,0);
int height = view.getMeasuredHeight();
int width = view.getMeasureWidth();


这里的0为MeasureSpec.UNSPECIFIED,忽略父控件印象。手动测量控件。不推荐这个方法,当布局嵌套层级多的时候,会有偏差。

3.通过MessageQueue的执行顺序判断

view.post(new Runnable() {
@Override
public void run() {
int height = view.getHeight();
int width = view.getwidth();
}
});


View的绘制流程所有的事件都是通过主线程的MessageQueue统一管理,由于MessageQueue是的链表结构,新post一个事件并执行时,说明activity的measure()方法和layout()方法已经走完,自然可以直接拿到控件宽高。

4.在onWindowFocusChanged方法里获取

@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
int height = view.getHeight();
int width = view.getwidth();
}


执行顺序为:Activity.oncreate()→Activity.onResume()→

→view.onMeasure()→view.onLayout()→onGlobalLayoutListener()→

→Activity.onWidnowFocusChanged()→…..→

→view.onDraw()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: