一、屏幕高度、状态栏高度、titlebar高度区分
二、获取整个屏幕的高度
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
Log.e("Allence", "屏幕高:" + dm.heightPixels);
三、获取状态栏的高度
1.通过系统尺寸资源获取
状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_height。但是系统给我们提供了一个Resource类,通过这个类可以获取资源文件,借此可以获取到status_bar_height:
/**
* 获取状态栏高度——方法1
* */
int statusBarHeight1 = -1;
//获取status_bar_height资源的ID
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
//根据资源ID获取响应的尺寸值
statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
}
Log.e("Allence", "状态栏-方法1:" + statusBarHeight1);
2.通过R类的反射
大家都知道Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,然后找status_bar_height:
/**
* 获取状态栏高度——方法2
* */
int statusBarHeight2 = -1;
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusBarHeight2 = getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
Log.e("Allence", "状态栏-方法2:" + statusBarHeight2);
三、标题栏(titlebar)高度的测量
1.如果设置了requestWindowFeature(Window.FEATURE_NO_TITLE)标题栏高度为0
2.获取标题栏高度的方法:
//屏幕
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
Log.e("WangJ", "屏幕高:" + dm.heightPixels);
//应用区域
Rect outRect1 = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
//View绘制区域
Rect outRect2 = new Rect();
getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect2);
int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //要用这种方法
//获取status_bar_height资源的ID
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
//根据资源ID获取响应的尺寸值
statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
}
titleHeight1 = viewTop - outRect1.top;
System.out.println(titleHeight1+"***************titleHeight1");
注意:在oncreat()方法中得到的titlebar的高度为0
四、随着手指移动的控件:
iv.setOnTouchListener(new OnTouchListener() { private int startx; private int starty; @Override public boolean onTouch(View v, MotionEvent event) { int ea = event.getAction(); DisplayMetrics dm = getResources().getDisplayMetrics(); int screenWidth = dm.widthPixels;
//这里如果screenHeight的长度是屏幕的长度因为屏幕的绘制区小于屏幕的总长度,所以控件会划出屏幕下方,
int screenHeight = dm.heightPixels-titleHeight1-statusBarHeight1;//所以这里screenHeight应该是屏幕长度减去标题栏(titlebar)的长度和状态栏(statusBar)的长度
System.out.println(screenHeight);
switch (ea) {
case MotionEvent.ACTION_DOWN:
startx = (int) event.getRawX();//获取触摸事件触摸位置的原始X坐标
starty = (int) event.getRawY();
case MotionEvent.ACTION_MOVE:
//event.getRawX();获得移动的位置
int dx = (int) event.getRawX() - startx;
int dy = (int) event.getRawY() - starty;
int l = v.getLeft() + dx;
int b = v.getBottom() + dy;
int r = v.getRight() + dx;
int t = v.getTop() + dy;
//下面判断移动是否超出屏幕
if (l < 0) {
l = 0;
r = l + v.getWidth();
}
if (t < 0) {
t = 0;
b = t + v.getHeight();
}
if (r > screenWidth) {
r = screenWidth;
l = r - v.getWidth();
}
if (b > screenHeight) {
b = screenHeight;
t = b - v.getHeight();
}
v.layout(l, t, r, b);
Log.e("sss", "onTouch: " +l+"=="+t+"=="+r+"=="+b);
startx = (int) event.getRawX();
starty = (int) event.getRawY();
v.postInvalidate();
// v.invalidate();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
});