Android获取屏幕高度、状态栏高度、标题栏高度
2016-09-19 18:07
603 查看
在android应用中,有时需要计算个View的位置,导致需要计算状态栏高度,标题栏高度等信息。为以后方便,在此做个简单记录。
晒代码前先了解一下Android屏幕区域的划分,如下图(该图引用自此文http://www.iteye.com/topic/828830 )
![](http://img.blog.csdn.net/20130914230521421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuX3N0YXIxY2hlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20130914230552859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuX3N0YXIxY2hlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1、 屏幕区域的获取
[java] view
plaincopy
activity.getWindowManager().getDefaultDisplay();
2、应用区域的获取
[java] view
plaincopy
Rect outRect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
其中,outRect.top 即是状态栏高度。
3、view绘制区域获取
[java] view
plaincopy
Rect outRect = new Rect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
用绘制区域的outRect.top - 应用区域的outRect.top 即是标题栏的高度。
注意: 如果刚启动Activity时就要计算这些数据,最好在 onWindowFocusChanged 函数中进行, 否则得到的某些数据可能是错误的,比如,应用区域高宽的获取。
详细代码如下:
[java] view
plaincopy
public class ScreenSize extends Activity {
private TextView mScreenSizeView ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_size);
mScreenSizeView = (TextView) findViewById(R.id.screen_size);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
System.out.println("second");
StringBuilder sb = new StringBuilder();
Dimension dimen1 = getAreaOne(this);
Dimension dimen2 = getAreaTwo(this);
Dimension dimen3 = getAreaThree(this);
sb.append("Area one : \n\tWidth: "+dimen1.mWidth + ";\tHeight: "+dimen1.mHeight);
sb.append("\nArea two: \n\tWidth: "+dimen2.mWidth + ";\tHeight: "+dimen2.mHeight);
sb.append("\nArea three: \n\tWidth: "+dimen3.mWidth + ";\tHeight: "+dimen3.mHeight);
mScreenSizeView.setText(sb.toString());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_screen_size, menu);
return true;
}
private Dimension getAreaOne(Activity activity){
Dimension dimen = new Dimension();
Display disp = activity.getWindowManager().getDefaultDisplay();
Point outP = new Point();
disp.getSize(outP);
dimen.mWidth = outP.x ;
dimen.mHeight = outP.y;
return dimen;
}
private Dimension getAreaTwo(Activity activity){
Dimension dimen = new Dimension();
Rect outRect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
System.out.println("top:"+outRect.top +" ; left: "+outRect.left) ;
dimen.mWidth = outRect.width() ;
dimen.mHeight = outRect.height();
return dimen;
}
private Dimension getAreaThree(Activity activity){
Dimension dimen = new Dimension();
// 用户绘制区域
Rect outRect = new Rect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
dimen.mWidth = outRect.width() ;
dimen.mHeight = outRect.height();
// end
return dimen;
}
[java] view
plaincopy
private class Dimension {
public int mWidth ;
public int mHeight ;
public Dimension(){}
}
6
![](http://img.blog.csdn.net/20130914232128828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuX3N0YXIxY2hlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
方法一:
方法二:
方法一与方法二获取屏幕宽度的方法类似,只是获取WindowManager 对象时的途径不同。
方法三:
方法四:
方法三与方法四类似。
晒代码前先了解一下Android屏幕区域的划分,如下图(该图引用自此文http://www.iteye.com/topic/828830 )
1、 屏幕区域的获取
[java] view
plaincopy
activity.getWindowManager().getDefaultDisplay();
2、应用区域的获取
[java] view
plaincopy
Rect outRect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
其中,outRect.top 即是状态栏高度。
3、view绘制区域获取
[java] view
plaincopy
Rect outRect = new Rect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
用绘制区域的outRect.top - 应用区域的outRect.top 即是标题栏的高度。
注意: 如果刚启动Activity时就要计算这些数据,最好在 onWindowFocusChanged 函数中进行, 否则得到的某些数据可能是错误的,比如,应用区域高宽的获取。
详细代码如下:
[java] view
plaincopy
public class ScreenSize extends Activity {
private TextView mScreenSizeView ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_size);
mScreenSizeView = (TextView) findViewById(R.id.screen_size);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
System.out.println("second");
StringBuilder sb = new StringBuilder();
Dimension dimen1 = getAreaOne(this);
Dimension dimen2 = getAreaTwo(this);
Dimension dimen3 = getAreaThree(this);
sb.append("Area one : \n\tWidth: "+dimen1.mWidth + ";\tHeight: "+dimen1.mHeight);
sb.append("\nArea two: \n\tWidth: "+dimen2.mWidth + ";\tHeight: "+dimen2.mHeight);
sb.append("\nArea three: \n\tWidth: "+dimen3.mWidth + ";\tHeight: "+dimen3.mHeight);
mScreenSizeView.setText(sb.toString());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_screen_size, menu);
return true;
}
private Dimension getAreaOne(Activity activity){
Dimension dimen = new Dimension();
Display disp = activity.getWindowManager().getDefaultDisplay();
Point outP = new Point();
disp.getSize(outP);
dimen.mWidth = outP.x ;
dimen.mHeight = outP.y;
return dimen;
}
private Dimension getAreaTwo(Activity activity){
Dimension dimen = new Dimension();
Rect outRect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
System.out.println("top:"+outRect.top +" ; left: "+outRect.left) ;
dimen.mWidth = outRect.width() ;
dimen.mHeight = outRect.height();
return dimen;
}
private Dimension getAreaThree(Activity activity){
Dimension dimen = new Dimension();
// 用户绘制区域
Rect outRect = new Rect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
dimen.mWidth = outRect.width() ;
dimen.mHeight = outRect.height();
// end
return dimen;
}
[java] view
plaincopy
private class Dimension {
public int mWidth ;
public int mHeight ;
public Dimension(){}
}
6
Android获取屏幕宽度的4种方法,android4种
方法一:WindowManager wm = (WindowManager) this .getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); int height = wm.getDefaultDisplay().getHeight();
方法二:
WindowManager wm1 = this.getWindowManager(); int width1 = wm1.getDefaultDisplay().getWidth(); int height1 = wm1.getDefaultDisplay().getHeight();
方法一与方法二获取屏幕宽度的方法类似,只是获取WindowManager 对象时的途径不同。
方法三:
WindowManager manager = this.getWindowManager(); DisplayMetrics outMetrics = new DisplayMetrics(); manager.getDefaultDisplay().getMetrics(outMetrics); int width2 = outMetrics.widthPixels; int height2 = outMetrics.heightPixels;
方法四:
Resources resources = this.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); float density1 = dm.density; int width3 = dm.widthPixels; int height3 = dm.heightPixels;
方法三与方法四类似。
相关文章推荐
- Android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
- Android编程之SparseArray<E>详解
- Android传感器的使用
- 安卓版本更新的逻辑
- 大牛们是怎么阅读 Android 系统源码的?
- Android:JS调用安卓方法介绍
- Android动画深入分析
- Android第一行代码学习笔记四----数据存储
- Android 游戏开发之 数独游戏
- android 一个 textview 设置不同的字体大小和颜色
- Android的消息机制
- Android的线程和线程池
- Android动态改变button顶部图片即drawableTop属性
- Android中的Drawable
- android:ToolBar的使用
- Android 中TextView部分文字颜色、点击跳转设置
- android 可拖动控件 ontouchevent
- Android 控件之ListView 的简单使用
- Android.mk详解
- Android弹出式对话框AlertDialog中的EditText自动打开软键盘