获取控件高度的时候我们用到getMeasuredHeigh()t和getHeight(),他们两个的区别就是getHeight获取的是屏幕内的高度,而getMeasuredHeigh()获取到的是控件实际的高度,即使是在屏幕外边。
在开发项目的时候遇到了一个情况是使用PopupWindow做了一个弹窗,弹窗的底部和根视图中某一个控件的顶部对齐。
用到了showAsDropDown(View anchor, int xoff, int yoff)或者showAtLocation(View parent, int gravity, int x, int y);
计算偏移的时候用到了自身的长度,我使用getMeasuredHeigh()调试时获取到的值总是0,后来经过一些调试和查询后,明白了在我的需要展示的view还没有画出来的时候是无法获取到它的宽高的,即便是写死的固定值也不可以。
于是:
final View contentView = LayoutInflater.from(this).inflate(R.layout.picture_quality_option, null);
if (pictureQualityWindow == null) {
pictureQualityWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
pictureQualityWindow.setOutsideTouchable(false);
pictureQualityWindow.setTouchable(true);
}
pictureQualityWindow.showAtLocation(bottomView, Gravity.NO_GRAVITY, 0, 0);
contentView.post(new Runnable() {
@Override
public void run() {
int height = contentView.getMeasuredHeight();
pictureQualityWindow.dismiss();
pictureQualityWindow.showAsDropDown(bottomView, 0, -(bottomView.getHeight() + height));
}
});
思路是先将他展示在屏幕外,然后再计算并记录他的高度,最后再把它展示屏幕内的位置。
解决办法2:
去查看要展示的PopupWindow的高度,然后把dp根据屏幕密度计算转换成像素单位的高度,使用这个值作为空间的偏移量。但是这种方法不够灵活,当控件改变的时候,还要去再去查看新的控件的高度,重新计算。
附dp和px相互转换的代码:
/**
* 将dp转换成px
*
* @param context
* @param dpValue
* @return
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 将像素转换成dp
*
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}