android 14分屏实战之小米su7的3分屏实现方案讨论及线索征集

android 11添加切换分屏功能 自Android 7开始官方就支持分屏显示,但没有切换分屏的功能,即交换上下屏幕。直到Android 13开始才支持切换分屏,操作方式是:分屏模式下双击中间分割线就会交换上下屏位置。本文的目的就是在Android 11上实现切换分屏的功能。 阅读详情
AI摘要

本文围绕小米SU7车机3分屏实现方案展开。因缺乏竞品调研资料,提出三种方案:一是额外添加第三屏,较好兼容2分屏但修改代码多;二是用自由窗口方案,不影响2分屏但需重新实现交互功能;三是用虚拟屏幕方案,耦合性小但渲染有性能影响。较推荐方案1。

背景:

hi,粉丝朋友们:
近来有学员朋友询问到了马哥一个问题关于小米su7的分屏实现方案问题,具体小米su7的实现现象如下:
在这里插入图片描述
具体源头视频详细地址:https://www.bilibili.com/video/BV1UK421a7iB

针对小米su7这个分屏明显和手机分屏有一个巨大的差异,那就是手机一般是2分屏,这里是3分屏
在这里插入图片描述
那么如果要你进行小米su7的实现你有什么方案或者想法么?

调研线索征集

调研竞品是如何实现的方案,那当然需要有竞品的设备,可以进行相关的dumpsys,这里因为手上没有su7的车机和汽车可以进行dump,所以暂时没办法进行实际的dump设备查看,即无法分析出小米su7是如何实现的这个3分屏。
这里求助一下广大网友,如果有条件可以对小米su7的车机设备进行dumpsys麻烦联系一下马哥哈,执行一下以下几个dumpsys命令:
让小米su7展示3分屏的画面上进行如下命令执行

1、dumpsys window windows > 1.txt
2、dumpsys activity containers > 2.txt
3、dumspys SurfaceFlinger > 3.txt

既然暂时没有相关的竞品调研资料,那么方案就只能自己先设计啦。

方案设计1

这里因为分屏原生支持了2分屏,所以可以考虑设计成额外添加一个第三屏,这样就可以比较好兼容原来的2分屏
在这里插入图片描述
优点:
比较好兼容原来的2分屏部分逻辑,方案的设计也是和原生2分屏高度吻合
缺点:
可能需要修改较多的原生2分屏的功能逻辑等,对原来代码修改比较大,引入的bug可能较多,而且bug可能排查难度较大

方案设计2

彻底不使用原来的分屏方案,使用自由窗口方案,整体的3分屏,其实就是3个自由窗口显示着

在这里插入图片描述

优点:
不需要考虑兼容影响原生自带的2分屏代码,这样3分屏和2分屏就彻底没啥关系了,相互不影响
缺点:
需要完全0开始实现,要把原来2分屏做的相关交互拖拽动画功能全部重新实现,工作量较大

方案设计3

彻底不使用原来的分屏方案,使用虚拟屏幕方案,3分屏分别对应不同的虚拟屏幕
在这里插入图片描述

优点:
不需要考虑兼容影响原生自带的2分屏代码,这样3分屏和2分屏就彻底没啥关系了,相互不影响,而且属于虚拟屏幕展示,所以和主屏幕基本上耦合性更加小
缺点:

1、需要完全0开始实现,要把原来2分屏做的相关交互拖拽动画功能全部重新实现,工作量较大
2、而且因为多个虚拟屏幕需要渲染一般都是gpu方式渲染,会给整个渲染带来性能影响,因为每次sf的vsync工作需要多渲染3个虚拟屏幕

好了暂时想到就是上面3个方案,其实还是比较推荐方案1,毕竟交互动画体验可以较多的复用2分屏,但是复用也意味着修改较多原来的逻辑,这个暂时还没有时间实战实现这个功能,各位学员们有兴趣可以去尝试实现一下。

更多framework技术干货,请关注下面“千里马学框架”

Android Nougat多窗口简析 Android从7.0开始支持多窗口,官方终于支持这一功能了。其实很多ODM厂商早已实现该功能,实现方式各种各样,最通用的方案是多Stack方案,比较痛苦的是每次版本升级都要花很大力气进行适配和解各种乱七八糟的bug,现在终于一统江湖了,并且第三方应用开始对多窗口进行适配兼容。 阅读详情

相关推荐

Android 14 设置界面会判断当前屏幕的大小,如果是大屏,则为左右屏显示

在14.0的系统rom定制化开发中,在某些时候,在大屏设备中,设置新增了左右分屏的功能,就是 左边显示主菜单,右边显示一级菜单的功能,某些情况下不需要,接下来关闭这个功能

安卓兼职framework和app工程师的博客 557

Android 把屏幕划分3等份;应用显示在中间区域

Android 把屏幕划分3等份;应用显示在中间区域 效果如下:

501846585_QQAndroid_java 1936

PADS Logic VX2.5元件绘制全流程:从零开始创建自定义元件库

本文详细介绍了在PADS Logic VX2.5中从零开始创建自定义元件库的全流程。内容包括理解PADS独特的四库分立结构、绘制原理图符号(CAE封装)、关联PCB封装、创建元件类型以及最终的调用验证。掌握元件绘制技能能从根本上提升设计效率、确保设计规范统一,并从源头杜绝原理图与PCB之间的关联错误,是硬件工程师必备的核心能力。

oo7890的博客 445

Android12分屏与定制三分屏设计文档

Android12三屏分屏与甩屏功能实现 本文介绍了基于Android12系统实现三屏分屏与甩屏功能的定制开发方案。系统在原有双屏基础上新增了第三屏幕区域,重新设计了分屏滑动算法和布局变化逻辑。主要模块包括: 分屏拖放:通过DragAndDropController实现拖拽功能,新增DragLayout视图处理拖拽事件 分屏控制:SplitScreenController管理分屏布局,StageCoordinator协调三个屏幕(主屏、副屏、后排屏)的交互 界面展示:SplitLayout处理分屏边界计算,

jsm1010的博客 1804

VN1630A硬件配置指南:手把手教你用CanApe搭建XCP标定工程(附ELF文件配置技巧)

本文详细介绍了如何使用VN1630A硬件和CanApe软件搭建XCP标定工程,包括硬件配置、CanApe工程创建、ELF文件处理及XCP协议层配置等关键步骤。特别针对实际项目中常见的错误和细节问题提供解决方案,帮助工程师高效完成ECU参数标定工作。

git9versioner的博客 1160

组态王通过以太网与西门子S7-200 SMART PLC通讯案例详解

通过以上步骤,我们成功实现了组态王与西门子S7-200 SMART PLC的以太网通讯。这一技术不仅提高了工业自动化系统的灵活性和可靠性,还为初学者提供了一个实用的学习案例。希望本文能帮助您快速掌握组态王与西门子S7-200 SMART PLC的通讯技术。如有任何疑问,欢迎留言讨论!

2401_88785500的博客 2006

Android的分屏模式

Android分屏模式是一项功能强大且实用的功能,可以为用户带来更好的多任务处理体验。无论是对于普通用户还是应用开发者,了解和掌握分屏模式的使用方法和开发指南都至关重要。

特立独行的博客 5434

LTspice基础教程-024.参数扫描;step指令用法

step指令用于参数扫描,扫描步骤可以是线性的,对数的或列表。 下面介绍几种常用用法: 绘制一简单电阻分压电路,如下: 线性扫描 语法:.step param <Name> <Start Value> <Stop Value> <Increment> 例:.step param Res 20 100 20 意思是R2的阻值从20变化到100,...

gaoyong_wang的博客 3万+

aosp14分屏分割线区域部分深入剖析-framework实战干货

核心看看这里的topPosition,bottomPosition是怎么计算的,刚好也可以解释为啥这里名字有16_9这个字符,其实本质就是计算个topPosition位置,拿竖屏来举例的话,这里因为想要屏幕宽度固定的,为了美观程度,所以一般topPosition这个区域要固定为一个16:9区域。上面已经分析出了分割线的几个SnapTarget,这些SnapTarget都是有固定位置的,那么接下来分析一下分割线如何到对应的SnapTarget。

liaosongmao1的专栏 278

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

【密码学】生成8位26个字母和数字的全排列(密码字典,密钥)c++代码(非递归高效直接)

生成8位26个字母和数字的全排列(密钥)代码(非递归高效直接) 用C语言或C++,生成一个8位的26个字母和数字的全排列的原代码,例如从:00000000到ZZZZZZZZ。 说明:生成的这个字典会非常大,有36^8条记录,估计要3T的硬盘,跑一个晚上看看         这个方法比递归更高效,更直接。                                                ...

Wu_Being 的优快云 博客 1万+

车载AAOS系统实现三分屏SplitScreen功能专题

摘要:本文介绍了AAOS系统实现三分屏功能的解决方案,基于Android车机手机三分屏实战项目课程。课程通过25+课时详细讲解从产品设计到功能实现的全过程,包括DividerView开发、Task拖拽逻辑等核心内容,并适配AOSP14和16版本。特色在于手把手教学实现与小米SU7相当的三分屏体验,适合具备Framework基础的开发者学习。文章还展示了在AAOS车机系统上开放分屏功能的具体步骤和效果演示,为车机开发提供实用参考。课程资料可通过文末链接获取。

liaosongmao1的专栏 95

视觉Transformer实战 | Data-efficient image Transformer(DeiT)详解与实现

在计算机视觉领域,Vision Transformer (ViT) 已经证明了纯 Transformer 架构在图像分类任务上的强大能力。然而,ViT 通常需要在大规模数据集上预训练才能达到最佳性能,DeiT (Data-efficient image Transformer) 通过引入一系列训练策略和优化,使得 Transformer 模型能够在相对较小的数据集上取得优异表现。本节将详细介绍 DeiT 的技术原理,并使用 PyTorch 从零开始实现 DeiT 模型。

盼小辉丶的博客 1344

Android分屏功能原理(基于Android12L)

SystemUI进程初始化阶段创建好分屏的RootTask节点,为后续分屏做准备Launcher3中任务管理界面触发分屏,然后Launcher做分屏前的动画,当动画结束通知SystemUI触发正常分屏SystemUI收到分屏通知,先显示分屏中间的DividerView,然后将应用Task挂载到初始化阶段创建好的RootTask节点下,同时修改对应的Bounds。

yan_chenglong的博客 3619

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文件夹对话框代码/重新生成三维图代码/导出工程图代码)之详细攻略 目录 基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用 1、调用SW的模型,并进行参数修改 1.1、VB按钮之SW的三维零件之间切换思想 1.2、调用SW 2、基础案例经验 2.1、设计SW的拉

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 3042

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

安卓14-16车机手机仿小米su7三分屏实战项目专题

从简单的产品背景,产品设计开始学习,实战带大家简单开始改造原生二分屏,循序渐进做出最初版本三分屏,逐步完善DividerView,落点设计,核心的Task部分拖拽放大等逻辑。去年在小米su7上市后,很多学员朋友就一直对它的车机三分屏非常感兴趣,学员朋友们都很想知道人家是怎么实现三分屏的,其实最希望的是马哥可以手把手教一下如何从0做出一个类似小米su7的三分屏功能。千里马手把手带你从0开始做一个车机的三分屏功能,最后做出来一个和市场上主流的小米su7 三分屏体验相当的三分屏成果。

learnframework的博客 1371

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android主副屏显示-Android14

获取 DisplayDeviceInfo。获取 DisplayDevice。

许浑的博客 5240

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

玩转Android14窗口管理基础概念

悬浮窗模式:在可移动且可调整大小的单独窗口中显示各个应用。画中画模式:在应用中用小窗口叠加显示其他应用。分屏模式:让系统可以左右或上下并排显示应用。多窗口模式允许多个应用同时共享同一屏幕。

weixin_34812732的博客 440

Android N App分屏模式完全解析(下)

转载地址:http://unclechen.github.io/2016/03/12/Android-N-App%E5%88%86%E5%B1%8F%E6%A8%A1%E5%BC%8F%E5%AE%8C%E5%85%A8%E8%A7%A3%E6%9E%90-%E4%B8%8B%E7%AF%87/ 在上篇中,介绍了什么是App分屏模式,以及如何设置我们的App来进入分屏模式。这次我

scott2017的博客 2万+

Android 原生 多屏显示 (分屏) 原理 解析

发快递就拉上几个

Jon.Lo 的专栏 1万+

android ”三分屏”视频播放器

最近由于工作需要,要写一个android上三分屏视频的播放器,在网上也没找到有用的资料,只好自己动手了。跟大家分享一下。 三分屏,主要由音频和图片构成。播放它的基础就是音、图同步。 我用了android两个组件,一个是viewflipper,用于播放图片,还有一个是mediaplayer,用于播放声音。 播放主要流程:解析xml,得到图片和音频的关系。比如哪一秒播放哪一张图片。然后就开始播放

minenamewj的专栏 1万+

aosp14的分屏接口ISplitScreen接口获取方式更新-学员疑问答疑

做相关分屏做小桌面项目时候,因为原来课程版本是基于android 13进行的讲解的,但是现在公司已经开始逐渐进行相关的android 14的适配了,但是android 14这块相比android 13还是有一些差异,适配起来有点,刚好借此机会给大家分享一下。目标就是为了可以调用ISplitScreen相关接口,aosp13的SplitScreen其实本质也是调用的ISplitScreenImpl的接口。可以看到是在这里进行的putBinder对象,放到了Bundle传递到了launcher进行。

learnframework的博客 1383

android 分屏 左右屏切换

Android分屏左右屏切换详解 随着移动设备的普及,用户对多任务处理的需求日益增加。在 Android 系统中,分屏功能使用户能够同时在同一屏幕上运行两个应用程序。本文将详细讲解如何在 Android 中实现分屏左右屏切换,并提供相关代码示例。 Android分屏功能简介 Android 分屏功能允许用户在同一屏幕上并排...

weixin_42087718的博客 1382

Android 14 的 8 个重要新特性深度解析

现如今,App生态日益丰富,数据分享变得尤为重要。通常情况下,分享界面的呈现取决于App的适配和系统的调度。然而,涉及更多细节和具体操作时,系统或App可能无法及时涵盖,因此自定义分享操作的支持变得十分必要。Android 14中引入了使用创建自定义对象a. 指定Iconb. 指定Titlec. 指定分享菜单点击后目标的类型的操作使用创建标准的Chooser Intent将实例放入键名为的Bundle中值得注意的是,传入的参数是数组,因为可以同时支持多个自定义操作)

虎哥LoveDroid 8347
上一篇: InputDispatcher的调试日志isLoggable动态开放logcat实战使用
下一篇: 安卓Settings值原理源码剖析存储最大的字符数量是多少?
千里马学框架
博客等级 码龄6年 1万+粉丝 651原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值