首页 > 其他分享 >Android经典实战之窗口和WindowManager

Android经典实战之窗口和WindowManager

时间:2024-09-03 13:52:40浏览次数:6  
标签:实战 窗口 LayoutParams WindowManager 视图 Window Android

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在Android开发中,“窗口”是一个非常基础且重要的概念。窗口通常用于承载和显示用户界面内容。了解窗口的工作机制,以及如何管理窗口,对于开发复杂的和用户体验良好的应用程序至关重要。

窗口的基本概念

1、 窗口(Window):

  • 窗口是一个抽象类,代表Android应用中的一个视图层级 (View Hierarchy) 的容器。
  • 一个窗口可以包含多个视图(View),这些视图构成了用户可见的界面。
  • 在Android中,Activity通常是窗口的主要表现形式,但窗口也可以独立于Activity存在,例如,在创建Dialog或Toast时。

2、 系统窗口(System Window):

  • 这些窗口通常是全局的,并且不局限于单个应用程序。
  • 一些系统级的界面,如状态栏、导航栏、键盘、系统提示框等,都是系统窗口。

3、 WindowManager:

  • WindowManager是Android为管理窗口提供的系统服务。
  • 它提供了一组API,允许开发者创建、调整、移除窗口等。
  • WindowManager 管理的窗口可以是应用窗口(由Activity创建)或者是独立窗口(如Toast、Dialog等)。

WindowManager与窗口管理

1. WindowManager的基本功能

WindowManager 是一个接口,定义了一系列与窗口相关的操作方法。常用的方法包括:

  • addView(View view, ViewGroup.LayoutParams params):添加一个新的窗口/视图。
  • updateViewLayout(View view, ViewGroup.LayoutParams params):更新已存在窗口/视图的布局参数。
  • removeView(View view):移除一个窗口/视图。
2. 获取 WindowManager 实例

通常情况下,可以通过 Context 来获取 WindowManager 实例:

WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
3. 窗口类型与布局参数

在调用 addView 方法时,需要传递布局参数 WindowManager.LayoutParams。一些常见的属性包括:

  • type:窗口的类型,如 TYPE_APPLICATION_OVERLAY(用于创建悬浮窗口)等。
  • flags:窗口的标志位,可以控制窗口的行为和属性,如 FLAG_NOT_TOUCH_MODAL(允许触摸传递到其他窗口)等。
  • gravity:窗口的对齐方式,如 Gravity.CENTER 等。
  • xy:窗口的位置坐标。

示例代码:

// 定义一个TextView作为窗口内容
TextView myView = new TextView(this);
myView.setText("Hello, World!");

// 设置布局参数
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 100;
params.y = 100;

// 添加窗口
windowManager.addView(myView, params);

系统窗口

系统窗口通常有很高的权限,可以显示在应用窗口的上方。要创建系统窗口,应用需要相应权限,比如 SYSTEM_ALERT_WINDOWOVERLAY_PERMISSION

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

需要注意,随着Android版本的更新,创建系统窗口(特别是悬浮窗口)需要处理更严格的权限管理。特别在Android 6.0 (API 23) 及以上,你需要在运行时请求权限。

Window与Activity的关系

  • Activity 与 Window: 每个Activity会和一个窗口绑定,Activity实际是通过Window来展示视图。
  • DecorView: 每个Window都有一个根视图,称为 DecorView。DecorView 包括了应用的视图层级以及系统装饰,例如标题栏、状态栏等。
// 获取Activity的窗口
Window window = getWindow();

// 获取DecorView(根视图)
View decorView = window.getDecorView();

总结

  • 窗口(Window) 是Android用户界面显示的基础单位,可以包含视图层级。
  • 系统窗口(System Window) 是系统级的全局窗口,例如状态栏、导航栏等。
  • WindowManager
  • Activity 与 Window 有紧密的联系,每个Activity绑定一个窗口,通过窗口管理视图显示。

了解和掌握窗口概念以及WindowManager的使用方法,在复杂的Android应用开发中是非常重要的,可以帮助你更灵活和高效地管理视图和用户界面。


欢迎关注我的公众号AntDream查看更多精彩文章!

标签:实战,窗口,LayoutParams,WindowManager,视图,Window,Android
From: https://blog.51cto.com/u_16841384/11908369

相关文章

  • 大模型书籍推荐:《实用机器学习》从理论到实战!(含PDF文档)
    一、内容介绍《实用机器学习》介绍了实用机器学习的工作流程,主要从实用角度进行了描述,没有数学公式和推导。这本书涵盖了数据收集与处理、模型构建、评价和优化、特征的识别、提取和选择技术、高级特征工程、数据可视化技术以及模型的部署和安装,结合3个真实案例全面、详......
  • Android Activity启动过程全解析
     https://blog.csdn.net/tenggangren/article/details/50925740 App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。一个App的程序入口到底是什么?是ActivityThread.main()。 1.ActivityManagerServices,简称AMS,服务端对象,负责系统中所有A......
  • Android UI绘制流程
     UI绘制流程,Activity、Dialog、PopupWindow等--android系统的事件分发流程分为很多部分: Native层–>ViewRootImpl层–>DecorView层–>Activity层–>ViewGroup层–>View层。  其实Toast窗口和Activity、Dialog、PopupWindow有一个不太一样的地方,就是Toast窗......
  • 极速掌握MinIO对象存储:从零部署到实战操作全攻略
    文章目录介绍安装部署安装服务器开放服务使用端口挂载磁盘安装MinIO创建目录下载安装文件设置执行权限目录结构如下所有节点都需要执行上述步骤编写启动脚本使用Console使用JavaApi调用获取永久链接可能报的错误错误1:ispartofrootdrive,willnotbeused错误2:Therequestsig......
  • 基于ssm+vue基于Android的考研咨询APP的设计与实现【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及和就业竞争的日益激烈,越来越多的学生选择继续深造,其中考研成为了众多学子的首选之路。然而,考研之路并非坦途,它要求考生具备扎实的......
  • 基于ssm+vue基于Android开发的智能音乐播放系统【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在数字化时代背景下,音乐已成为人们日常生活中不可或缺的一部分,它不仅能够调节情绪、缓解压力,还能丰富我们的精神世界。随着移动互联网技术的飞速发展......
  • Vue3.0《小兔鲜儿》企业级电商项目开发实战,市场主流热门技术和业务解决方案
    请描述一下这个系统?【回答技巧】从3个方面来回答这个问题:|–系统背景及系统概述|–系统包括的业务模块及主业务流程|–责任模块【回答示例】第一个方面:系统背景及系统概述优购时尚商城是香港上市公司百丽国际公司为拓宽旗下运动品牌服饰市场而开发的一个专业销售购物网站......
  • Android设备之间UVC Gadget bulk模式无法正常打开问题
    平台:RK3588Android版本:12内核版本:Linux5.10.66问题:通过usbgadget枚举uvc设备后,使用bulk传输,连接windowsPC可用正常打开预览,连接到另外AndroidHost设备无法正常打开。如果使用isochronous方式传输则都正常。分析:连接到PC(windows)上可以正常出图,但是连接到另外一个RK3588设......
  • Android架构组件:MVVM模式的实战应用与数据绑定技巧
    Android应用开发已经逐渐变得高效且模块化,MVVM(Model-View-ViewModel)设计模式与Android架构组件的结合,无疑提升了开发者的生产力。在本指南中,我们将详细介绍MVVM模式的概念,如何在Android中实现MVVM,并结合实际操作案例让读者更好地理解与运用数据绑定技巧。1.MVVM模式......
  • Android Glide加载图片时,基于图片宽高比自动伸缩ImageView高度
    ImageView布局<ImageViewandroid:id="@+id/iv"android:layout_width="match_parent"android:layout_height="wrap_content"/>代码实现GlideUtil.java/***加载图片,支持高度伸缩*@paramcontext上下文......