Android实现一键开启自由窗口、分屏、画中画模式——画中画模式

article/2025/9/15 17:30:08

转载请注明出处:https://blog.csdn.net/sunmmer123

Android实现一键开启自由窗口、分屏、画中画模式系列

  • 一键开启进入自由窗口模式
  • 一键开启进入分屏模式
  • 一键进入画中画模式

通过前俩篇博文,我们学习了一些多窗口模式中的自由窗口模式分屏模式的知识
最后,我们学习一下多窗口模式中的最后一个模式:画中画模式


画中画模式

Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity。 画中画是一种特殊类型的多窗口模式,最常用于视频播放。使用该模式,用户可以通过固定到屏幕一角的小窗口观看视频,同时在应用之间进行导航或浏览主屏幕上的内容。

  • 概念理解比较抽象,还是先看个效果图直观了解一下:
    进入画中画模式后,窗口会显示在屏幕的最上层,位于系统选择的一角。可以随意拖动小画面窗口。当点按该窗口时,会看到两个控件:全屏切换开关(位于窗口的中心)和关闭按钮(右上角的“X”)。
    在这里插入图片描述

1、如何切换至画中画模式

  • 首先声明对画中画的支持,清单文件中对对应Activity设置android:supportsPictureInPicture为true
    在这里插入图片描述
  • 为了防止在画中画模式转换期间发生布局更改,设置一下android:configChanges属性
    在这里插入图片描述
  • 在点击按钮进入画中画模式之前,先判断下是否可以使用画中画模式,因为低内存设备可能无法使用画中画模式
    在这里插入图片描述
  • 点击按钮切换到画中画模式,要进入画中画模式,Activity 必须调用 enterPictureInPictureMode()
    在这里插入图片描述

2、画中画模式的参数构建器介绍

画中画模式中,我们可通过它的参数构建器实现窗口宽高比例的设置以及添加窗口控件

  • 创建画中画模式的参数构建器
  • 设置宽高比例值,第一个参数表示分子,第二个参数表示分母
  • setAspectRatio设置画中画窗口的宽高比例
  • setActions设置控件
    在这里插入图片描述

3、处理画中画模式下的界面元素

当 Activity 进入或退出画中画模式时,系统会调用 onPictureInPictureModeChanged(),可以在这个回调中做一些界面元素的交互处理
在这里插入图片描述

关于画中画模式就简单介绍到这里,具体的学习及玩法,可以参考开发文档:画中画支持


关于Android的多窗口模式就全部介绍完了,总结一下:

  • 关于开启自由窗口/分屏模式的一个要点,就是要熟悉掌握一个栈知识点
  • 关于自由模式里面窗口支持放大缩小以及移动位置,原理是不断的更改Task的边界(用Rect表示),然后根据Task的边界来重新缩放Task,从而达到窗口缩放和拖动的作用。
  • 画中画模式分栈的核心工作是把Activity从id是FULLSCREEN_WORKSPACE_STACK_ID的栈移动到id是PINNED_STACK_ID的stack里面

这些底层实现原理,推荐这篇博客:Android多窗口框架全解析

源码后续会上传,如果有问题或者意见,欢迎评论区留言讨论!


http://chatgpt.dhexx.cn/article/q8kub6Zm.shtml

相关文章

Android多窗口模式(分屏模式)

Android N 支持多窗口模式,或者叫分屏模式,即在屏幕上可以同时显示多个窗口。 在手机模式下,两个应用可以并排或者上下同时显示,如图 1 所示,屏幕上半部分的窗口是系统的 CLOCK 应用,下半部分是系统设置功能…

git 命令怎么创建新分支?

问题 比如:我们要以 dev 分支创建一个 test-branch 分支。 解决 1、在本地创建一个 test-branch 分支,并切换到该分支。 git checkout -b test-branch执行完,可以使用下面命令查看是否创建了该本地分支 git branch -a2、把分支推到远程仓…

git命令之快速搭建远程仓库

首先使用系统管理员账号登录远程服务器,具体步骤如下所示: 1 安装git应用程序 sudo apt-get install git 2 创建git用户组和git用户,具体命令如下所示: groupadd git adduser git -g git 3 修改git用户默认shell为git-shell…

Git命令常用操作 代码拉取和提交

常规的git命令就是以下几个语句 项目首次拉取 git clone 项目地址url拉取并同步代码到本地 git pull将本地所有更改的文件添加到缓存区 git add .添加备注,方便之后查看历史提交记录 git commit -m "本次提交备注信息"提交到git仓库 git push

git命令之新建仓库

一. 配置git用户名 1)安装git,配置用户名和邮箱 git config --global user.name "你的用户名" git config --global user.email "你的注册邮箱" 2)使用git config --global --list查看配置 二. 工作区操作 1&#x…

常见Git命令使用

常见Git命令使用 1.初始化创库 git init 2.git status 这个命令顾名思义就是查看状态, 这个命令可以算是使用最频繁的一个命令了, 建议大家没事就输入下这个命令, 来查看你当前 git 仓库的一些状态。 3.git add 文件名 将文件添加到git仓库…

git命令拉取代码

流程 1在本地clone项目【保持与远程仓库一致】 此时已绑定远程仓库 git clone xxxx2.添加文件 3.放到暂存区 git add .4.提交到本地仓库 git commint -m "提示信息"5推送到远程仓库 git push origin master其他命令 分支命令 分支就是每个人开发 互不影响 之后…

Git 命令之stash

Git 命令之stash 前言1 stash1.1 描述1.2 应用场景命令使用 前言 使用 Git 作为代码版本管理,早已是现在开发工程师必备的技能。可大多数工程师还是只会最基本的保存、拉取、推送,遇到一些commit管理的问题就束手无策,或者用一些不优雅的方式…

git命令登录

1. 执行登陆用户名和密码命令 git config --global user.email "youexample.com" git config --global user.name "Your Name"2. 生成密钥对 ssh-keygen -t rsa -C "your_emailyouremail.com"3. 配置公钥私钥 然后将 .ssh/id_rsa.pub中的内容复…

git命令详解

一、简介 git作为应用广泛的一种分布式版本控制系统,其与svn比较最大的差别就是一个是分布式,一个是集中式,git在每个开发者的本地有一个完整的版本库,当在本地处理工作时,无需联网便可修改提交,当需要与其…

关于Git这一篇就够了

目录 前言 发展过程 集中式与分布式的区别 Debian/Linux安装Git 配置git环境:git config --global 创建本地空仓库:git init 新建文件添加到本地仓库:git add、git commit -m 改写提交:git commit --amend 查看历史提交日…

【信号与系统】—知识点:自由响应、强迫响应、暂态响应、稳态响应、零输入响应、零状态响应如何区分!

自由响应、强迫响应、暂态响应、稳态响应、零输入响应、零状态响应如何区分! 一、系统的响应划分 二、自由响应、强迫响应 自由响应和强迫响应是从数学上来分解的,没有什么物理意义,自由响应是齐次解,因为它的形式和激励无关&am…

一阶电路的零状态响应

零状态响应就是电路在零初始状态下(动态元件初始储能为零)由外施激励引起的响应。 RC电路的零状态响应 在t0时刻,开关S闭合,电路接入直流电压源US。根据KVL,有 uRuCUS (KVL ∑u0 指定回路的绕行方向是顺时针的,R、C的电压参考方向…

MATLAB:零状态响应(lsim(连续);filter(离散))、冲激响应(impulse或impz)和阶跃响应(step)、卷积(conv)

例1:求系统y(t)2y(t)100y(t)10x(t)的零状态响应,已知x(t)sin(2pt)u(t)。【连续时间系统零状态响应】 例2:求系统y(t)2y(t)100y(t)10x(t)的零状态响应,已知x(t)d(t)。(ts0;te5;dt0.01)【连续时间系统冲激响应…

连续系统的时域分析(一)LTI连续系统微分方程解法3——零状态响应的求解方法

(一)零状态响应的定义 零状态响应是系统在初始状态为零时,仅有输入信号 f ( t ) f(t) f(t)引起的响应。用 y z s ( t ) y_{zs}(t) yzs​(t)表示 (二)解题步骤 (1)当微分方程右端不含冲击函数 δ ( t ) \delta(t) δ…

《信号与系统》连续时间系统零状态响应的 MATLAB 实现

3.5.1 连续时间系统零状态响应的 MATLAB 实现 参考书籍 《信号与系统》 Matlab 库函数中的 **lsim()**能对微分方程描述的 LTI 连续时间系统的响应进行仿真。 lsim(b,a,x,t) 该调用格式中,a 和 b 是由描述系统的微分方程左边和右边系数构成的两个行向量&#xff…

Matlab计算信号和的卷积,求解微分方程的阶跃响应、冲激响应和零状态响应

参考资料: 连续时间系统的时域分析涉及到的Matlab函数: step:用于计算连续时间系统的单位阶跃响应。 impulse:用于计算连续时间系统的单位冲激响应。 lsim:用于计算连续系统在任意输入作用下的响应。 dsolve&…

实验二 信号与系统Matlab 求系统的冲激响应、阶跃响应、零状态响应

** 实验二 ** 实验内容 题目一: clear all; ts0;te5;dt0.01; num[0 3 2]; den[1 5 6]; systf(num,den); tts:dt:te; yimpulse(sys,t); plot(t,y);grid;xlabel(time(sec));ylabel(h(t))题目二: clear all; ts0;te5;dt0.01; num[0 0 1]; den[2 1 8];%…

二阶电路的零状态响应

二阶电路零状态响应公式推导 下图所示电路在 时电容和电感上储能都为零,即 , , t0 时开关闭合,电压源 Us 开始对电路供电。现讨论 时响应的变化规律。 电路的 KVL 方程为换路后电路的初始状态为 0 ,即, …

【Matlab】系统的响应分析

前言 一个信号系统课程中使用Matlab对系统的零状态响应、零输入响应、完全响应、冲激响应、阶跃响应求解、波形生成以及分析的实验。 一、内容 设系统的微分方程为: 激励为: 起始状态条件为: 、 可求得 零输入响应: 零状…