Android经典实战之窗口和WindowManager

2024-09-03 14:12

本文主要是介绍Android经典实战之窗口和WindowManager,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文首发于公众号“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查看更多精彩文章!

AntDream

这篇关于Android经典实战之窗口和WindowManager的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133182

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目