安卓Windows界面相关的类

本文介绍了Android中的Window、WindowManager和Display的概念。Window是Activity的显示界面对象,由PhoneWindow实现。WindowManager是与设备窗体管理器交互的接口,每个实例与特定的Display绑定。Display代表逻辑显示屏,包括应用显示区域和实际显示区域。DisplayMetrics用于存储屏幕尺寸、密度等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Window

Activity的显示界面对象,并作为顶层View被加入到WindowManager中。Window提供了标准的UI显示策略:界面背景、标题区域、默认的事件处理。

该抽象类仅仅有一个子类PhoneWindow。在Activity的创建过程中,ActivityThread类调用performLaunchActivity方法时会运行Activity.attach()方法,该方法包括以下的代码片段:

 
  1. //将包括Fragment的容器绑定到Activity实例中
  2. mFragments.attachActivity(this, mContainer, null);
  3. //为Activity实例创建一个新的Window对象
  4. mWindow = PolicyManager.makeNewWindow(this);
  5. mWindow.setCallback(this);
  6. mWindow.setOnWindowDismissedCallback(this);
  7. mWindow.getLayoutInflater().setPrivateFactory(this);
  8. if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
  9. mWindow.setSoftInputMode(info.softInputMode);
  10. }
  11. if (info.uiOptions != 0) {
  12. mWindow.setUiOptions(info.uiOptions);
  13. }
  14. ...
  15. //为Window对象设置Window Manager
  16. mWindow.setWindowManager(
  17. (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
  18. mToken, mComponent.flattenToString(),
  19. (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
  20. if (mParent != null) {
  21. mWindow.setContainer(mParent.getWindow());
  22. }
  23. mWindowManager = mWindow.getWindowManager();

WindowManager

应用和设备窗体管理器(Window Manager)交互的接口,能够通过例如以下方式获取该类实例:

 
  1. Context.getSystemServier(Context.WINDOW_SERVICE);

每一个WindowManager实例都和一个特定的Display对象绑定在一起。

Display

代表一个逻辑显示屏(logical Display),显示区域被划分成两种:

  • 应用显示区域(Application Display Area):该区域负责显示应用的Window,不包括系统相关的显示。所以该区域有可能会比实际电视区域小,能够通过例如以下方法获取应用显示区域:
 
  1. public void getSize(Point outSize); //返回显示区域的大小,结果保存在outSize中。单位为px
  2. public void getRectSize(Rect outSize); //返回显示区域的矩形区域,结果保存在outSzie中,单位为px
  3. public void getMetrics(DisplayMetrics outMetrics); // 返回显示区域的指标。详细能够查阅DisplayMetrics类
  • 实际显示区域(Real Display Area): 该区域显示应用的window和系统相关的显示,普通情况下,该区域大小和绑定的物理屏幕大小同样,除非Window Manager模拟将内容显示在小屏幕上,能够通过以下的方法获取该区域的大小:
 
  1. public void getRealSize(Point outSize);
  2. public void getRealMetrics(DisplayMetrics outMetrics);

注意:逻辑显示屏和物理显示屏不同,逻辑显示屏能够被映射到多个物理显示屏上(比方在Presentation的时候)

DisplayMetrics

用于保存屏幕大小,屏幕密度,字体缩放的类,一般通过以下的代码获取包括上述指标的该类对象:

 
  1. DisplayMetrics metrics = new DisplayMetrics();
  2. getWindowManager().getDefaultDisplay().getMetrics(metrics);

该类中包括以下比較重要的字段:

 
  1. public static final int DENSITY_LOW = 120; //
  2. public static final int DENSITY_MEDIUM = 160; // 默认的屏幕密度
  3. public static final int DENSITY_HIGH = 240; //
  4. public static final int DENSITY_XHIGH = 320; //
  5. public int widthPixels; //屏幕的宽度,单位为px
  6. public int heightPixels; //屏幕的高度。单位为px
  7. public float density; //屏幕密度(以160dpi为基准),当屏幕密度为120dpi时。该字段的值为0.75。当屏幕密度为320dpi时。该字段的值为2
  8. public int densityDpi; //屏幕密度,单位为每英寸的像素点个数
  9. public float xdpi; //X方向上每英寸像素点的个数
  10. public float ydpi; //Y方向上每英寸像素点的个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值