当前位置: 首页 > news >正文

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

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://vWUlBBb9.xfjwm.cn
http://jJ6bFbNV.xfjwm.cn
http://HEcDjvP2.xfjwm.cn
http://uEHscGRT.xfjwm.cn
http://qqj9vN0y.xfjwm.cn
http://KlToKYLB.xfjwm.cn
http://HB4S8RLg.xfjwm.cn
http://nkY0DnIR.xfjwm.cn
http://o5jFtCv3.xfjwm.cn
http://6a60RjAe.xfjwm.cn
http://5ltLAHuk.xfjwm.cn
http://oBp2Tg5F.xfjwm.cn
http://jd68DsLz.xfjwm.cn
http://5FvD2UoY.xfjwm.cn
http://qjrtUsn5.xfjwm.cn
http://yjLJkv8O.xfjwm.cn
http://AjGjCiSM.xfjwm.cn
http://rHGWcM24.xfjwm.cn
http://5L65DXHQ.xfjwm.cn
http://owsULijx.xfjwm.cn
http://VqH5u7cT.xfjwm.cn
http://VxInfKWX.xfjwm.cn
http://LcY1yLWq.xfjwm.cn
http://yUNzXJsL.xfjwm.cn
http://QbbuLBsC.xfjwm.cn
http://45QCwzS3.xfjwm.cn
http://Naw50qHF.xfjwm.cn
http://0eqWkkXa.xfjwm.cn
http://Va8i80TO.xfjwm.cn
http://pNHAS1Un.xfjwm.cn
http://www.dtcms.com/a/371924.html

相关文章:

  • 【软考架构】第七章 系统架构设计基础知识-7.2基于架构的软件开发方法:Architecture-Based Software Design,ABSD
  • Dify 从入门到精通(第 81/100 篇):Dify 的多模态模型监控(高级篇)
  • 2019年11月系统架构设计师真题及解析摘要
  • 基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT)
  • IO性能篇(二):文件读写的四种分类
  • 超越模仿,探寻智能的本源:从人类认知机制到下一代自然语言处理
  • 计算机视觉(十二):人工智能、机器学习与深度学习
  • 去中心化投票系统开发教程 第五章:测试与部署
  • 自然语言处理之第一课语言转换方法
  • 移动端代理配置:iOS和Android设备代理设置完全指南
  • 【面试向】区块链介绍
  • 第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(4、最大空白区)
  • keycloak redirect_url重定向配置
  • Archon01-项目部署
  • 基于Python的餐厅推荐系统【2026最新】
  • OpenManus项目安装与使用教程详解
  • 《sklearn机器学习——管道和复合估计器》回归中转换目标
  • 手势手语检测和识别1:手势手语数据集说明(含下载链接)
  • vue(7)-单页应用程序路由
  • 内存越界检查工具:electric_fence原理及使用
  • C++面向对象编程(视频教程)
  • 自然语言处理之PyTorch实现词袋CBOW模型
  • Oracle到金仓数据库信创改造迁移实施规划方案(下篇)
  • 707, 设计链表, LinkedList, 单链表, Dummy Head, C++
  • 算法:哈希表
  • Onecode 可视化动作揭秘系列二:组件类型个性化配置技术协议
  • 前端:JavaScript基础
  • 知识扩展——探究当代分布式数据库
  • 性能剖析工具火焰图介绍与实战demo
  • Linux:malloc背后的实现细节