在android应用中,有时需要计算个View的位置,导致需要计算状态栏高度,标题栏高度等信息。为以后方便,在此做个简单记录。

晒代码前先了解一下android屏幕区域的划分,如下图(该图引用自此文http://www.iteye.com/topic/828830 )

1 屏幕区域的获取

  1. activity.getWindowManager().getDefaultDisplay();

2、应用区域的获取

  1. Rect outRect = new Rect();
  2. activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);

其中,outRect.top 即是状态栏高度。

3、view绘制区域获取

  1. Rect outRect = new Rect();
  2. activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);

用绘制区域的outRect.top - 应用区域的outRect.top 即是标题栏的高度。

注意: 如果刚启动Activity时就要计算这些数据,最好在 onWindowFocusChanged  函数中进行, 否则得到的某些数据可能是错误的,比如,应用区域高宽的获取。

详细代码如下:

  1. public class ScreenSize extends Activity {
  2. private TextView mScreenSizeView ;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_screen_size);
  7. mScreenSizeView = (TextView) findViewById(R.id.screen_size);
  8. }
  9. @Override
  10. public void onWindowFocusChanged(boolean hasFocus) {
  11. super.onWindowFocusChanged(hasFocus);
  12. if(hasFocus){
  13. System.out.println("second");
  14. StringBuilder sb = new StringBuilder();
  15. Dimension dimen1 = getAreaOne(this);
  16. Dimension dimen2 = getAreaTwo(this);
  17. Dimension dimen3 = getAreaThree(this);
  18. sb.append("Area one : \n\tWidth: "+dimen1.mWidth + ";\tHeight: "+dimen1.mHeight);
  19. sb.append("\nArea two: \n\tWidth: "+dimen2.mWidth + ";\tHeight: "+dimen2.mHeight);
  20. sb.append("\nArea three: \n\tWidth: "+dimen3.mWidth + ";\tHeight: "+dimen3.mHeight);
  21. mScreenSizeView.setText(sb.toString());
  22. }
  23. }
  24. @Override
  25. public boolean onCreateOptionsMenu(Menu menu) {
  26. getMenuInflater().inflate(R.menu.activity_screen_size, menu);
  27. return true;
  28. }
  29. private Dimension getAreaOne(Activity activity){
  30. Dimension dimen = new Dimension();
  31. Display disp = activity.getWindowManager().getDefaultDisplay();
  32. Point outP = new Point();
  33. disp.getSize(outP);
  34. dimen.mWidth = outP.x ;
  35. dimen.mHeight = outP.y;
  36. return dimen;
  37. }
  38. private Dimension getAreaTwo(Activity activity){
  39. Dimension dimen = new Dimension();
  40. Rect outRect = new Rect();
  41. activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
  42. System.out.println("top:"+outRect.top +" ; left: "+outRect.left) ;
  43. dimen.mWidth = outRect.width() ;
  44. dimen.mHeight = outRect.height();
  45. return dimen;
  46. }
  47. private Dimension getAreaThree(Activity activity){
  48. Dimension dimen = new Dimension();
  49. // 用户绘制区域
  50. Rect outRect = new Rect();
  51. activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
  52. dimen.mWidth = outRect.width() ;
  53. dimen.mHeight = outRect.height();
  54. // end
  55. return dimen;
  56. }
  1. private class Dimension {
  2. public int mWidth ;
  3. public int mHeight ;
  4. public Dimension(){}
  5. }

Android如何获取系统高度、标题栏和状态栏高度的更多相关文章

  1. android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度

    android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度 1.获取自己定义控件height 在本Activity中获取当前Activity中控件的height: Button button ...

  2. Android中获取系统上安装的APP信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...

  3. android:sharedUserId 获取系统权限

    最近在做的项目,有好大一部分都用到这个权限,修改系统时间啊,调用隐藏方法啊,系统关机重启啊,静默安装升级卸载应用等等,刚开始的时候,直接添加权限,运行就报错,无论模拟器还是真机,在logcat中总会得 ...

  4. Android apk获取系统权限

    Android在apk内部,即通过java代码来进行修改系统文件或者修改系统设置等等,这样需要获取系统权限. 通过直接配置apk运行在System进程内 1. 在应用程序的AndroidManifes ...

  5. Android项目--获取系统通讯录列表

    ----------------- 通讯录列表 ----------------- 按常理来说,获取系统通讯录列表,无非就是将通讯录的数据库打开获取数据,适配,添加即可. Cursor cursor; ...

  6. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

    本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...

  7. MTK Android 如何获取系统权限

    Android如何获得系统(system)权限 Android中如何修改系统时间(应用程序获得系统权限) 在 android 的API中有提供 SystemClock.setCurrentTimeMi ...

  8. Android开发 - 获取系统输入法高度的正确姿势

    问题与解决 在Android应用的开发中,有一些需求需要我们获取到输入法的高度,但是官方的API并没有提供类似的方法,所以我们需要自己来实现. 查阅了网上很多资料,试过以后都不理想. 比如有的方法通过 ...

  9. Android中获取系统的时间

    activity代码 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); set ...

随机推荐

  1. 深入浅出ES6(十五):子类 Subclassing

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 在之前的文章<深入浅出ES6(十三):类 Class>中,我们一起深 ...

  2. Heroku 与 ASP.NET 5

    一. Heroku 简单来讲,Heroku是一个支持多种语言.极易部署.多价位可免费的 Pass 平台,通过 Buildpack 搭建语言运行环境, 默认内建的大部分是 Web 开发中较为常见的语言, ...

  3. node入门开发遇到的问题

    最近在看node入门这本书,https://cnodejs.org/getstart 里面是跟随作者完成一个小的demo,书中不免会有遗漏的,下面是我在实现里面最后一个例子时遇到的问题,希望能够帮助其 ...

  4. Windows PAE 寻址

    PAE 就是物理地址扩展.我们常规的寻址方式是之前的将虚拟地址化为10 10 12的方式来寻址页目录,页表,页偏移,但是在开始PAE之后的寻址方式发生了改变,将32位的虚拟地址转化成 2 9 9 12 ...

  5. kill -9 和kill

    kill pid 在kill进程的同时,会将包删掉该进程所在webapps目录下的文件夹,如iexpense文件夹 kill -9 pid 会强制删掉进程,但是不是删掉该进程所在webapps目录下的 ...

  6. Linux Command Line 解析

    Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...

  7. iOS复杂动画之抽丝剥茧(Objective-C & Swift)

    一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...

  8. updmap-sys failed. Output has been stored in

    Ubuntu 12.04升级到Ubuntu 12.04lts的时候,出现错误: Do you want to continue? [Y/n] ySetting up tex-common (4.04) ...

  9. [iOS]集成环信SDK然后运行时候crash了-[NSBundle initWithURL:]: nil URL argument'

    Crash的reason是-[NSBundle initWithURL:]: nil URL argument' 1.首先我是用cocoapods导入的环信的SDK.然后怎么运行怎么crash. 2. ...

  10. Android百度地图开发05之公交信息检索 + 路线规划

    在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容. 公交信息检索 实际上,公交信息检索与POI检索.在线建议检索非常相似,也是把你需要检索的信息发送给百度地图 ...