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://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;。這個功能在實際項目中有很大…