kotlin - 平板分屏,左右拖动,2个Activity计算宽度,使用ActivityOptions、Rect

 使用平板,api33才支持,可以左右拖动,分屏第一个页面 , 思考:分屏后,对整个app的影响,包括屏幕旋转android:configChanges,点击跳转,传递参数,屏幕变小后的布局、影响。
分屏有3种方式(这里实现第一种):
一:任务栈中有Main,A页面,A打开全新的B页面分屏,A左边, B右边
二:任务栈中有Main,A页面,Main和A页面分屏,Main在左边,A在右边
三:任务栈中只有Main页面,分屏左右2部分(left,right),把右部分的view缓存到新打开的A页面显示。分屏后Main页面显示left的视图,A页面显示right的视图

package com.example.androidkotlindemo2.pad.splitscreen;import android.app.ActivityOptions;
import android.content.Intent;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import com.example.androidkotlindemo2.R;
import com.example.androidkotlindemo2.utils.LogUtils;/*** Author : wn* Email : maoning20080808@163.com* Date : 2025/8/10 10:24* Description :  使用平板,api33才支持,可以左右拖动,分屏第一个页面 , 思考:分屏后,对整个app的影响,包括屏幕旋转android:configChanges,点击跳转,传递参数,屏幕变小后的布局、影响。* 分屏有3种方式(这里实现第一种):* 一:任务栈中有Main,A页面,A打开全新的B页面分屏,A左边, B右边* 二:任务栈中有Main,A页面,Main和A页面分屏,Main在左边,A在右边* 三:任务栈中只有Main页面,分屏左右2部分(left,right),把右部分的view缓存到新打开的A页面显示。分屏后Main页面显示left的视图,A页面显示right的视图* 官方分屏窗口:https://github.com/googlearchive/android-MultiWindowPlayground*/
public class SplitScreenAActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.split_screen_a);Button btnSplitScreen = findViewById(R.id.btn_split_screen_a);Button btnFullScreen = findViewById(R.id.btn_full_screen_a);btnSplitScreen.setOnClickListener(v -> {// 启动分屏模式if (isInMultiWindowMode()) {LogUtils.Companion.d("启动分屏if");// 如果已经在分屏模式,直接启动SplitScreenAActivitystartActivity(new Intent(this, SplitScreenAActivity.class));} else {LogUtils.Companion.d("启动分屏else");// 进入分屏模式并启动SplitScreenAActivityenterSplitScreen();}});btnFullScreen.setOnClickListener(v -> {// 退出分屏模式(如果正在分屏)if (isInMultiWindowMode()) {exitSplitScreen();}});}private void enterSplitScreen() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {// 1. 首先进入多窗口模式if (!isInMultiWindowMode()) {LogUtils.Companion.d("enterSplitScreen 11");// 启动自己进入多窗口模式Intent selfIntent = new Intent(this, SplitScreenAActivity.class);selfIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT |Intent.FLAG_ACTIVITY_NEW_TASK);DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);// 配置SecondaryActivity的边界(右侧)Rect leftBounds = new Rect(0, 0, metrics.widthPixels/2, metrics.heightPixels);ActivityOptions options = ActivityOptions.makeBasic();options.setLaunchBounds(leftBounds);startActivity(selfIntent, options.toBundle());//return;}// 2. 现在已经在多窗口模式,启动第二个ActivityDisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);int halfWidth = metrics.widthPixels / 2;// 配置SecondaryActivity的边界(右侧)Rect rightBounds = new Rect(halfWidth, 0, metrics.widthPixels, metrics.heightPixels);ActivityOptions options = ActivityOptions.makeBasic();options.setLaunchBounds(rightBounds);LogUtils.Companion.d("enterSplitScreen 22");Intent secondaryIntent = new Intent(this, SplitScreenBActivity.class);secondaryIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT |Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(secondaryIntent, options.toBundle());} else {// 不支持分屏的设备,简单启动ActivitystartActivity(new Intent(this, SplitScreenBActivity.class));}}private void exitSplitScreen() {SplitScreenBActivity.mActivity.finish();/*// 关闭SplitScreenBActivityIntent intent = new Intent(this, SplitScreenBActivity.class);//intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_SINGLE_TOP);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);//finish();*/}
}

package com.example.androidkotlindemo2.pad.splitscreen;import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import com.example.androidkotlindemo2.R;/*** Author : wn* Email : maoning20080808@163.com* Date : 2025/8/10 10:24* Description :*/
public class SplitScreenBActivity extends AppCompatActivity {//这里简单使用,可以使用广播,获取任务栈的方式实现。public static SplitScreenBActivity mActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.split_screen_b);mActivity = this;Button btnBack = findViewById(R.id.btn_back);btnBack.setOnClickListener(v -> finish());}@Overridepublic void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) {super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig);}@Overrideprotected void onStop() {super.onStop();// 当ActivityB停止时(例如用户退出分屏),可以执行一些清理操作}
}

split_screen_a.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"android:background="#FF9800"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="分屏第1个页面"android:textSize="24sp"android:textColor="#FFFFFF"/><Buttonandroid:id="@+id/btn_split_screen_a"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:text="进入分屏模式"/><Buttonandroid:id="@+id/btn_full_screen_a"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:text="全屏模式"/></LinearLayout>

split_screen_b.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"android:background="#4CAF50"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="分屏第2个页面"android:textSize="24sp"android:textColor="#FFFFFF"/><Buttonandroid:id="@+id/btn_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:text="返回"/></LinearLayout>

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

v0.29.3 敏感词性能优化之繁简体转换 opencc4j 优化

敏感词性能调优系列 v0.29.0 敏感词性能优化提升 14 倍全过程 v0.29.1 敏感词性能优化之内部类迭代器内部类 v0.29.2 敏感词性能优化之基本类型拆箱、装箱的进一步优化的尝试 v0.29.3 敏感词性能优化之繁简体转换 opencc4j 优化 背景 opencc4j opencc4j 中&#xff0c;因…

Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件

首先说一下&#xff0c;这里解决的问题应用场景&#xff1a; sparksql处理Hive表数据时&#xff0c;判断加载的是否是分区表&#xff0c;以及分区表的字段有哪些&#xff1f;再进一步限制查询分区表必须指定分区&#xff1f; 这里涉及到两种情况&#xff1a;select SQL查询和…

谷歌发布文本嵌入模型EmbeddingGemma(附部署方式)

EmbeddingGemma是谷歌于2025年9月开源的开放式文本嵌入模型&#xff0c;专为端侧设备设计&#xff0c;具备以下核心优势&#xff1a; 性能优势 在MTEB基准测试中&#xff0c;EmbeddingGemma在500M以下参数规模的多语言文本嵌入模型中表现最佳&#xff0c;性能接近参数翻倍的顶…

CPU调度——调度的目标

2.2.2 调度的目标 当系统中“想运行”的实体多于 CPU 的数量时&#xff0c;调度就不可避免地要在“效率”与“公平”之间做取舍。直观地说&#xff0c;一类目标希望把硬件压榨到更高的利用率&#xff0c;让单位时间内做更多的工作&#xff1b;另一类目标则关心个体体验&#x…

C++ 8

封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象&#xff08;至少3个&#xff09;再把该容器中的对象&#xff0c;保存到文件中。再把这些学生从文件中读取出来&#xff0c;放入另一个容器中并且遍历输出该容器里的学生。#include <iostream…

短视频矩阵系统源码开发搭建技术指南--支持OEM

短视频矩阵系统架构设计短视频矩阵系统通常采用分布式架构&#xff0c;包含内容管理、用户管理、推荐算法、存储分发等模块。主流技术栈包括微服务框架&#xff08;Spring Cloud/Dubbo&#xff09;、消息队列&#xff08;Kafka/RabbitMQ&#xff09;、数据库&#xff08;MySQL/…

不连续页分配器补充

vmalloc流程 1. 背景&#xff1a;vmalloc() 要解决的问题 kmalloc() 要求 虚拟地址连续&#xff0c;物理页也连续。大块内存分配可能失败。vmalloc() 只保证 虚拟地址连续&#xff0c;物理内存可以由很多不连续的页拼接。 实现的关键就是&#xff1a; 在 vmalloc 区域 找一块空…

bug | 事务粒度不能太大,含demo

刷到一个说法&#xff0c;建议不要使用transaction注解。这个说法不太准确&#xff0c;注解可以用&#xff0c;但标注的事务粒度不能太大&#xff0c;这样可能会引起数据库阻塞问题。以下介绍注解事务和编程式事务的两种用法。 关键字&#xff1a;声明式事务&#xff0c;编程式…

别再看人形机器人了!真正干活的机器人还有这些!

每次提起“机器人”&#xff0c;你脑海中是不是立刻浮现出双足行走、拟人微笑、还能陪你聊天的那种“人形机器人”&#xff1f;但真相是&#xff1a;人形机器人并非更实用&#xff0c;只是满足了我们对“人类替代品”的幻想。事实上&#xff0c;机器人的世界远比我们想象的更丰…

垃圾回收,几种GC算法及GC机制

1.什么是垃圾回收&#xff1f;如何触发垃圾回收&#xff1f; 垃圾回收(GC)是自动管理内存的一种机制&#xff0c;它负责自动释放不再被程序引用的对象所占用的内存&#xff0c;这种机制减少内存泄漏和内存管理错误的可能性。可以通过多种方式触发&#xff1a;内存不足时&#x…

更智能的零售终端设备管理:合规、安全与高效

目录 引言&#xff1a;为什么零售连锁和自助终端需要更智能的设备管理&#xff1f; 典型应用场景 1. 便利店连锁 2. 大型超市 3. 加油站 4. 自助终端 核心功能&#xff0c;驱动高效与安全 1. 批量配置 2. 定时策略同步 3. 设备状态监控 4. Kiosk 模式&#xff0c;保…

Elasticsearch:向量搜索过滤 - 保持相关性

作者&#xff1a;来自 Elastic Carlos Delgado 仅执行向量搜索以找到与查询最相似的结果是不够的。通常需要过滤来缩小搜索结果。本文解释了在 Elasticsearch 和 Apache Lucene 中向量搜索的过滤是如何工作的。 Elasticsearch 拥有丰富的新功能&#xff0c;帮助你为自己的用例构…

Linux 性能调优之 OOM Killer 的认知与观测

写在前面 博文内容涉及到OOM Killer机制,以及利用 Cgroup/dmesg/BPF 观测 OOM Killer 事件,包括云原生环境下的 OOM Killer 机制的简单介绍 这是内存调优的最后一篇,之后会分享一些网络调优相关内容 理解不足小伙伴帮忙指正 😃,生活加油 我不再将这个世界与我所期待的,塑…

webrtc之高通滤波——HighPassFilter源码及原理分析

文章目录前言一、导读二、高通滤波过程1.HighPassFilter的创建1&#xff09;HighPassFilter的作用2&#xff09;开启条件3&#xff09;开启配置2.高通滤波整体过程1&#xff09;触发时机2&#xff09;滤波器创建3&#xff09;高通滤波过程三、算法实现1.原理1&#xff09;滤波器…

《sklearn机器学习——聚类性能指数》同质性,完整性和 V-measure

函数&#xff1a;homogeneity_score 参数&#xff1a; labels_true: array-like, shape [n_samples] 样本的真实标签。 labels_pred: array-like, shape [n_samples] 样本的预测标签。返回值&#xff1a; h: float 同质性得分&#xff0c;在0到1之间&#xff0c;值越大表示聚…

HarmonyOS 应用开发新范式:深入剖析 Stage 模型与 ArkTS 状态管理

好的&#xff0c;请看这篇关于 HarmonyOS 应用开发中 Stage 模型与 ArkTS 状态管理的技术文章。 HarmonyOS 应用开发新范式&#xff1a;深入剖析 Stage 模型与 ArkTS 状态管理 引言 随着 HarmonyOS 4、5 的发布以及 API 12 的迭代&#xff0c;HarmonyOS 的应用开发范式已经全面…

一个Java的main方法在JVM中的执行流程

一个Java的main方法在JVM中的执行流程可以分为​​四大阶段​​&#xff1a;​​加载 -> 链接 -> 初始化 -> 执行​​。// HelloWorld.java public class HelloWorld {public static void main(String[] args) {String message "Hello, JVM!";System.out.p…

聚焦诊断管理(DM)的传输层设计、诊断服务器实现、事件与通信管理、生命周期与报告五大核心模块

聚焦诊断管理(DM)的传输层设计、诊断服务器实现、事件与通信管理、生命周期与报告五大核心模块,明确 UDS(ISO 14229-1)与 SOVD(ASAM 服务化诊断)的功能逻辑、交互流程及规范性要求(SWS_DM 系列)。 1 UDS 传输层(UDS Transport Layer) 作为 DM 与诊断客户端的 UDS …

关于npm的钩子函数

一、npm scripts 的生命周期钩子&#xff08;Lifecycle Scripts&#xff09; npm 提供了一些 ​​特殊的 script 名称​​&#xff0c;它们是 ​​生命周期钩子​​&#xff0c;会在特定时机 ​​自动执行​​。这些钩子包括&#xff1a; 1.prepublishOnly(在 npm publish之前执…

167.在Vue3中使用OpenLayers模仿共享单车,判断点是否放在规划的电子围栏内

一、前言大家好&#xff0c;这里分享一个 Vue3 OpenLayers 的小案例&#xff1a; 模仿共享单车的电子围栏功能&#xff0c;用户在地图上绘制停泊点时&#xff0c;系统会自动判断该点是否在规划好的电子围栏内&#xff08;多边形或圆形&#xff09;。这个功能在实际项目中有很大…