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

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可