Android 项目必备(四十二)-->Android 多窗口模式

news2024/9/24 6:20:47

简介

  • 自由窗口模式:
    该模式类似于常见的桌面操作系统, 应用界面的窗口可以自由的拖动和修改大小。

  • 分屏模式
    该模式可以在手机上使用, 该模式将屏幕一分为二, 同时显示两个应用界面。

  • 画中画模式:
    该模式主要用于TV, 在该模式下视频播放的窗口可以一直在最顶端显示。(视频小窗口)

详细请查看:Android 文档

准备

1. Manifest 新增属性

  • android:resizeableActivity="false"
    这个属性可以放置于 application 和 activity 的标签下, 作用在对应的区间里面。这个属性表示 application 或者 activity 在分屏或者 freeform 的模式启动, true 代表支持, false 代表不支持。

  • android:supportsPictureInPicture= "false"
    这个属性可以放置于 activity 的标签下, 这个属性表示 activity 是否支持画中画模式, true 代表支持, false 代表不支持。

2. 多窗口 API

  • isInMultiWindowMode(): 查询是否处于多窗口模式
  • isInPictureInPictureMode():查询是否处于画中画模式
  • Activity.onMultiWindowModeChanged() 多窗口模式变化时进行通知(进入或退出多窗口)
  • onPictureInPictureModeChanged() 画中画模式变化时进行通知(进入或退出画中画模式)
  • enterPictureInPictureMode() 调用这个接口进入画中画模式,如果系统不支持,这个调用无效
  • setLaunchBounds()在系统已经处于Freeform模式时,可以通过这个参数来控制新启动的Activity大小,如果系统不支持,这个调用无效。

实现

1. 效果图

在这里插入图片描述

2. 实现

  1. 在清单文件中申请权限
<uses-permission android:name="android.permission.INTERNET"/>
  1. 添加属性
<application
        ...
        android:resizeableActivity="true"
        android:usesCleartextTraffic="true"
        ...>
  1. 代码
public class MainActivity extends AppCompatActivity {

    private static final int WINDOWING_MODE_FREEFORM = 5;
    
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn_open_one).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showWindows("com.kjd.airecognition","com.kjd.airecognition.WebActivity");
            }
        });

        findViewById(R.id.btn_open_two).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showWindows("com.kjd.gesturedemo","com.kjd.gesturedemo.PieActivity");
            }
        });


    }

    private void showWindows(String packageName,String classPath) {
        //获取屏幕高宽
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int screenWidth = metric.widthPixels;
        int screenHeight = metric.heightPixels;

        Intent intent = new Intent();
        intent.setClassName(packageName,classPath);

        intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
        ActivityOptions activityOptions = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            activityOptions = ActivityOptions.makeBasic();
        }

        //设置为freeform模式
        try {
            Method method = ActivityOptions.class.getMethod("setLaunchWindowingMode", int.class);
            method.invoke(activityOptions, WINDOWING_MODE_FREEFORM);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //freeform模式下自由窗口的大小
        int freeformWidth = 1200;
        int freeformHeight = 800;
        //居中显示
        int left = screenWidth / 2 - freeformWidth / 2;
        int top = screenHeight / 2 - freeformHeight / 2;
        int right = screenWidth / 2 + freeformWidth / 2;
        int bottom = screenHeight / 2 + freeformHeight / 2;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            activityOptions.setLaunchBounds(new Rect(left,top,right,bottom));
        }
        Bundle bundle = activityOptions.toBundle();
        startActivity(intent,bundle);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目--基于RTSP协议的简易服务器开发(1)

RTSP协议简介&#xff1a;RTSP&#xff08;Real Time Streaming Prcotol&#xff09;是位于TCP\IP体系应用层的数据传输协议&#xff0c;通常的RTSP协议包含 RTSP、RTP、RTCP协议。一般而言&#xff1a;RTSP负责服务器与客户端之间的请求与响应RTP负责服务器、客户端之间传输媒…

【双U网络:传感器间自监督:全色锐化】

W-NetPan: Double-U network for inter-sensor self-supervised pan-sharpening &#xff08;W-NetPan&#xff1a;用于传感器间自监督全色锐化的双U网络&#xff09; 由于遥感数据的提供日益增多&#xff0c;可以通过全色锐化方法来处理空间-光谱限制。然而&#xff0c;融合…

【JavaGuide面试总结】操作系统篇·上

【JavaGuide面试总结】操作系统篇上1.什么是系统调用呢&#xff1f; 能不能详细介绍一下2.进程和线程的区别3.进程有哪几种状态?4.进程间的通信常见的的有哪几种方式呢?5.线程间的同步的方式有哪些呢?6.操作系统中进程的调度算法有哪些7.产生死锁的四个必要条件是什么?8.解…

KT148A语音芯片ic的供电电压以及电源输入的详细说明V1

目录 一、问题简介 二、详细说明 问题1&#xff1a;芯片的供电说明 问题2&#xff1a;我测试反而3.7V接到KT148A的7脚才能工作&#xff0c;正常吗&#xff1f; 问题3&#xff1a;分别测试了锂电池和USB供电&#xff0c;都不正常&#xff1f; 三、总结 完整的测试板如下图…

大型WMS系统源码 带扫码入库移动端源码

WMS的核心价值是降低成本&#xff0c;提高效率&#xff0c;能够反映和控制仓库各个环节的运作&#xff0c;实现事件前后的管理&#xff0c;为企业创造更高的效益。 WMS系统是智能仓库管理系统的缩写&#xff0c;WMS系统主要负责的是入库业务、出库业务、仓库调拨、库存调拨和虚…

Raspberry实践笔记—配置RobotFramework自动化测试环境

一般RobotFramework都是安装在Windows&#xff0f;Linux的PC机上&#xff0c;这里将简单介绍在树莓派硬件平台上配置RobotFramework的开发和运行环境。 树莓派上配置了自动化测试软件&#xff0c;可以考虑用多个这个廉价的“计算机”&#xff0c;开展并行的测试用例执行。成倍…

每日分享(免登录积分商城系统 动力商城 兑换商城源码)

​demo软件园每日更新资源,请看到最后就能获取你想要的: 1.Python教程2022&#xff1a;100天从新手到大师 完整版 Python 100天从新手到大师是一个Python入门教程&#xff0c;Python从入门到精通&#xff0c;专门为热爱python的新手量身定做的学习计划&#xff0c;100天速成pyt…

C++类和对象:拷贝构造函数和运算符重载

目录 一. 拷贝构造函数 1.1 什么是拷贝构造函数 1.2 编译器默认生成的拷贝构造函数 1.3 拷贝构造函数特性总结 二. 运算符重载 2.1 运算符重载概述 2.2 比较运算符重载&#xff08;> > < <&#xff09; 2.2.1 >运算符的重载 2.2.2 运算符的重载 2.…

面对海量的监控视频数据应该如何存储?

面对有些行业及工作特殊性&#xff0c;监控摄像头是必不可免的&#xff0c;面对成千上万的摄像头&#xff0c;每时每秒产生的视频数据&#xff0c;选择一个合理的存储方式&#xff0c;将会为您节省一大笔费用。而且&#xff0c;有些监控摄像头视频数据还需要按照国家要求存储30…

SpringCloud OpenFeign 源码分析

前言 由于公司正在高sky迁移&#xff0c;我们部门的老应用SpringBoot 1.x升级2.x&#xff0c;其中老的Neflix Feign也升级成了Spring Cloud OpenFeign&#xff0c;由于业务条线的各种高低版本以及服务之间调用等存在一些兼容性问题&#xff0c;于是看了下OpenFeign的源码&#…

【Web逆向】某津市公共资源交易平台链接加密分析

【Web逆向】某津市公共资源交易平台链接加密分析声明一、起因二、开始分析三、源码下载地址声明 本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 一、起因 好奇抓取 天津市公共资源交易平台 的…

这个WPF DataGrid组件,可以让业务数据管理更轻松!(Part 1)

DevExpress WPF的DataGrid组件是专用于WPF平台的高性能XAML网格控件&#xff0c;该组件附带了几十个具有高影响力的功能&#xff0c;使开发者可以轻松地管理数据并根据也无需要在屏幕上显示数据。PS&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚…

Telerik JustMock 2023 R1 Crack

Telerik JustMock 2023 R1 Crack 制作单元测试的最快、最灵活和模拟选项。 Telerik JustLock也很简单&#xff0c;可以使用一个模拟工具来帮助您更快地生成更好的单元测试。JustLock使您更容易创建对象并建立对依赖关系的期望&#xff0c;例如&#xff0c;互联网服务需求、数据…

常用的xpath

一、xpath 语法 简单看一下菜鸟教程即可 1、基本语法 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式&#xff1a; 表达式描述nodename选取此节点的所有子节点。/从根节点选取&#xff08;取子节点&#…

数据挖掘(1)--基础知识学习

前言 自20世纪90年代以来&#xff0c;随着数据库技术应用的普及&#xff0c;数据挖掘&#xff08; Data Mining &#xff09;技术已经引起了学术界、产业界的极大关注&#xff0c;其主要原因是当前各个单位已经存储了超大规模&#xff0c;即海量规模的数据&#xff0c;未来能够…

【设计模式】5.原型模式

概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现的的 clone() 方法。具体原型类&#xff1a;实现抽象原型类的 clone() 方…

【IP技术】ipv4和ipv6是什么?

IPv4和IPv6是两种互联网协议&#xff0c;用于在互联网上标识和寻址设备。IPv4&#xff08;Internet Protocol version 4&#xff09;是互联网协议的第四个版本&#xff0c;是当前广泛使用的互联网协议。IPv4地址由32位二进制数构成&#xff0c;通常表示为4个十进制数&#xff0…

使用python测试框架完成自动化测试并生成报告-实例练习

练习一: 使用unittest 完成自动化测试并使用HttpTestRunner生成报告 1、写个简单的计算器功能&#xff0c;大小写转换功能&#xff0c;随机生成字符串功能 2、编写测试用例&#xff0c;不同的数据&#xff08;你能想到的所有测试用例&#xff09;&#xff0c;并进行断言。除0的…

GitHub 标星 15w,如何用 Python 实现所有算法?

学会了 Python 基础知识&#xff0c;想进阶一下&#xff0c;那就来点算法吧&#xff01;毕竟编程语言只是工具&#xff0c;结构算法才是灵魂。 新手如何入门 Python 算法&#xff1f; 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码&#xf…

蒸汽波风格图不会画?AI作画帮你秒级出图

在最近几年&#xff0c;AI图像生成技术在视觉艺术领域得到了广泛应用&#xff0c;可以通过数据和机器学习技术来创作出非常有趣的艺术品。今天我就带来的图片风格是&#xff1a;蒸汽波混搭二次元。 蒸汽波混搭二次元图像的创作&#xff0c;大都是以现有的二次元图像作为基础&a…