最近做了一些功能,都是与popupWIndow显示的位置有关。大家都知道Android系统的手机是在太多了,而手机系统做的各有各的特点,导致popupWindow显示的位置总是无法适应所有手机。最难缠的要数魅族手机。popupWindow显示不同有以下几个现状:
popupWindow.showAtlocation(view,Gravity.NO_GRAVITY,x,y),讨论的是当y=0时的处理方法
一、横竖屏显示不一致:(这个在魅族手机上基本上必现)PopupWindow可以说是一个容器,装着view,然后画到屏幕上。竖屏的时候,它的起始位置是在输入法的起始位置;横屏的时候,他的起始位置就在屏幕的最上面。
魅族手机:横屏的时候,起始位置和statusbar的起始位置一样,这样你的popupWIndow就会出现在最上面,并被statusbar挡住。
解决方法:1. 这种方法适用于大部分机型,并不适用于View.onDraw(Canvas cavas)方法中
Rect rect = new Rect();
getWindowVisibleDisplayFrame(rect); rect.top就是statusbar的高度,用屏幕的高度
context.getResources().getDisplayMetrics().heightPixels减去rect.top就可以了。
2.这种根据系统提供的属性去获得该机型的statusBar的高度。这个方法我测试过,应该是适用于所有机 型
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}并不适用于View.onDraw(Canvas cavas)方 法中
int[] location = new int[2];
getLocationInWindow(location); location[0]是屏幕宽的的偏差,location[1]是屏幕高度的偏差,遇到这种情况,用location[1]也可以。
二.onDraw(Canvas canvas)另一种情况是popupWindow显示遮住了底部的标题栏
原因:他的画布高度包括下标题的高度,而且他的画布起始位置是statusbar+下 标题的高度。这种情况也是非常 特殊的
这种情况你要想画一些图片或者文字,并要与正常机型区别对待时,就有点困难,我想了很长时间:
解决方法:
1. Rect frame = new Rect();
getWindowVisibleDisplayFrame(frame);
frame.bottom - frame.top = 画布的高度。
屏幕的高度 - frame.bottom = 下标题的高度。
可根据实际情况用获得到的这些数据。