很多时候,我们需要获得控件的信息(如:高度),用于实现一些比较好的效果,比如好看动画什么的等等。
在只有onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它的尺寸,肯定是不行的,以前的想法是通过延迟等布局被画完了才获取控件的高度。
在只有onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它的尺寸,肯定是不行的,以前的想法是通过延迟等布局被画完了才获取控件的高度。
try {
new Handler().postDelayed(new Runnable() {
public void run() {
......//获取控件高度信息
}
}, 100);
} catch (Exception ex) {
ex.printStackTrace();
}
这种方法是能够得到正确的信息的,但是总感觉这种方法不是很好。
发现一些更好的方法,不用做延迟就能得到控件的信息。
方法一:
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
imageView.measure(w, h);
int height =imageView.getMeasuredHeight();
int width =imageView.getMeasuredWidth();
方法二:
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
height = imageView.getHeight();
width = imageView.getWidth());
return true;
}
});
方法三:
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
height = imageView.getHeight();
width = imageView.getWidth());
}
});
方法一: 比其他的两个方法多了一次计算,也就是多调用了一次onMeasure()方法,该方法虽然看上去简单,但是如果要目标控件计算耗时比较大的话,不建议使用,如listView等.
方法二,它的回调方法会调用很多次,并且滑动TextView的时候任然会调用,所以不建议使用.
方法三,比较合适.
当然,实际应用的时候需要根据实际情况而定