Android N实现分屏
开篇语:
Android原生一直是信仰,之前用的moto Xt1060更新到了5.1就不支持更新了,就一直在纠结换Google Nexus系列的对比一下,4和5太老旧,5x和6p太贵,那么只有选择6了。下决心买了一台,到手之后迫不及待的升了N。升级之后确实流畅了很多,分屏是一个不错的功能,国内的厂商有的早已经有分屏,于是就想研究研究原生N是怎么实现分屏的,看了官方的文档以及搜索来的资料,写了一个小的Demo,所以写这篇博客记录一下。
以下来自官方的文档说明:
Android N 添加了对同时显示多个应用窗口的支持。 在手持设备上,两个应用可以在“分屏”模式中左右并排或上下并排显示。 在电视设备上,应用可以使用“画中画”模式,在用户与另一个应用交互的同时继续播放视频。
如果您使用 N Preview SDK 构建应用,则可以配置应用处理多窗口显示的方法。 例如,您可以指定 Activity 的最小允许尺寸。 您还可以禁用应用的多窗口显示,确保系统仅以全屏模式显示应用。
就是说Android N支持多窗口,你可以在浏览网页的时候看视频或者聊微信。(前提是应用支持分屏)
用户可以通过以下方式切换到多窗口模式:
- 若用户打开Overview并长按 Activity 标题,则可以拖动该 Activity 至屏幕突出显示的区域,使 Activity 进入多窗口模式。
- 若用户长按 Overview 按钮,设备上的当前 Activity 将进入多窗口模式,同时将打开 Overview 屏幕,用户可在该屏幕中选择要共享屏幕的另一个 Activity。
多窗口的生命周期:
如处理运行时变更中所述,用户使用多窗口模式显示应用时,系统将通知 Activity 发生配置变更。 这也会发生在当用户调整应用大小,或将应用恢复到全屏模式时。 该变更与系统通知应用设备从纵向模式切换到横向模式时的 Activity 生命周期影响基本相同,但设备不仅仅是交换尺寸,而是会变更尺寸。 如处理运行时变更中所述,您的 Activity 可以自行处理配置变更,或允许系统销毁 Activity,并以新的尺寸重新创建该 Activity。
如果用户调整窗口大小,并在任意维度放大窗口尺寸,系统将调整 Activity 以匹配用户操作,同时根据需要发布运行时变更。 如果应用在新公开区域的绘制滞后,系统将使用windowBacground 属性或默认 windowBackgroundFallback
样式属性指定的颜色暂时填充该区域。
compileSdkVersion 24buildToolsVersion "24.0.0 rc4"defaultConfig {applicationId "com.zwb.fenping"minSdkVersion 24targetSdkVersion 24versionCode 1versionName "1.0"
针对多窗口进行配置:
android:resizeableActivity
在清单的 <activity>
或 <application>
节点中设置该属性,启用或禁用多窗口显示:
android:resizeableActivity=["true" | "false"]
如果该属性设置为 true,Activity 将能以分屏和自由形状模式启动。 如果此属性设置为 false,Activity 将不支持多窗口模式。 如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。
如果您的应用面向 Android N,但未对该属性指定值,则该属性的值默认设为 true。
android:supportsPictureInPicture
在清单文件的 <activity>
节点中设置该属性,指明 Activity 是否支持画中画显示。 如果 android:resizeableActivity
为 false,将忽略该属性。
android:supportsPictureInPicture=["true" | "false"]
在清单文件的 <activity>节点中设置该属性,指明 Activity 是否支持画中画显示。如果 android:resizeableActivity为 false,将忽略该属性。
当然你还可以指定在自由形状模式时 Activity 的默认大小、位置和最小尺寸:
<activity android:name=".MainActivity"><layout android:defaultHeight="500dp"android:defaultWidth="600dp"android:gravity="top|end"android:minimalSize="450dp" />
</activity>
对于 Android N,<layout>清单文件元素支持以下几种属性,这些属性影响 Activity 在多窗口模式中的行为:
- android:defaultWidth 以自由形状模式启动时 Activity 的默认宽度。
- android:defaultHeight 以自由形状模式启动时 Activity 的默认高度。
- android:gravity 以自由形状模式启动时 Activity 的初始位置。
- android:minimalSize 分屏和自由形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。
在多窗口模式中运行应用
Android N 添加了新功能,以支持可在多窗口模式中运行的应用。
多窗口模式中被禁用的功能
在设备处于多窗口模式中时,某些功能会被禁用或忽略,因为这些功能对与其他 Activity 或应用共享设备屏幕的 Activity 而言没有意义。 此类功能包括:
- 某些系统UI自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏。
- 系统将忽略对android:screenOrientation属性所作的更改。
Activity类中添加了以下新方法,以支持多窗口显示。
- Activity.inMultiWindow() 调用该方法以确认 Activity 是否处于多窗口模式。
- Activity.inPictureInPicture() 调用该方法以确认 Activity 是否处于画中画模式。注:画中画模式是多窗口模式的特例。 如果 myActivity.inPictureInPicture()返回 true,则 myActivity.inMultiWindow()也返回 true。
- Activity.onMultiWindowChanged() Activity 进入或退出多窗口模式时系统将调用此方法。 在 Activity 进入多窗口模式时,系统向该方法传递 true 值,在退出多窗口模式时,则传递 false 值。
- Activity.onPictureInPictureChanged() Activity 进入或退出画中画模式时系统将调用此方法。 在 Activity 进入画中画模式时,系统向该方法传递 true 值,在退出画中画模式时,则传递 false 值。
每个方法还有 Fragment版本,例如 Fragment.inMultiWindow()。
进入画中画模式:
Activity.enterPictureInPictureMode()
。
在多窗口模式中启动新 Activity
在启动新 Activity 时,用户可以提示系统如果可能,应将新 Activity 显示在当前 Activity 旁边。 要执行此操作,可使用标志Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
。 传递此标志将请求以下行为:
- 如果设备处于分屏模式,系统会尝试在启动系统的 Activity 旁创建新 Activity,这样两个 Activity 将共享屏幕。 系统并不一定能实现此操作,但如果可以,系统将使两个 Activity 处于相邻的位置。
- 如果设备不处于分屏模式,则该标志无效。
如果设备处于自由形状模式,则在启动新 Activity 时,用户可通过调用 ActivityOptions.setLaunchBounds()
指定新 Activity 的尺寸和屏幕位置。 如果设备不处于多窗口模式,则该方法无效。
注:如果您在任务栈中启动 Activity,该 Activity 将替换屏幕上的 Activity,并继承其所有的多窗口属性。 如果要在多窗口模式中以单独的窗口启动新 Activity,则必须在新的任务栈中启动此 Activity。
用户可以在两个 Activity 共享屏幕的同时在这两个 Activity 之间拖放。因此,如果您的应用目前不支持拖放功能,您可以在其中添加此功能。
- android.view.DropPermissions令牌对象,负责指定对接收拖放数据的应用授予的权限。
- View.startDragAndDrop() View.startDrag()的新别名。要启用跨 Activity 拖放,请传递新标志 View.DRAG_FLAG_GLOBAL。如需对接收拖放数据的 Activity 授予 URI 权限,可根据情况传递新标志
View.DRAG_FLAG_GLOBAL_URI_READ
或View.DRAG_FLAG_GLOBAL_URI_WRITE。
- View.cancelDragAndDrop() 取消当前正在进行的拖动操作。只能由发起拖动操作的应用调用。
- View.updateDragShadow() 替换当前正在进行的拖动操作的拖动阴影。只能由发起拖动操作的应用调用。
- Activity.requestDropPermissions() 请求使用 DragEvent中包含的 ClipData传递的内容 URI 的权限。
看完了官方的文档,于是乎就开始着手搞一把试试效果。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.zwb.fenping.MainActivity"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="我是一个分屏的应用" />
</RelativeLayout>
下面就是在AndroidManifest中设置相关的属性实现分屏。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zwb.fenping"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"<strong><span style="color:#ff0000;"> android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"android:resizeableActivity="true"</span></strong>><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
运行一下,的运行效果:
![](/assets/blank.gif)
https://developer.android.com/preview/features/multi-window.html#overview
Android N实现分屏相关推荐
- Android N App分屏模式完全解析
Android N App分屏模式完全解析(上) 发表于 2016-03-12 | 分类于 技术 | 上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Andro ...
- Android N App分屏模式完全解析(上)
上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Android7.0原生系统就可以支持两个App横屏并排或者竖屏上下摆放了.第二个新特性就是在Android TV ...
- android n进入分屏代码分析_不只是分屏多任务,Android N 的这些特性也与你有关...
本文来自 TECH2IPO / 创见,作者@DavidZh 2016 年 Google I/O 大会开放注册之后,Google 出人意料地放出了下一代移动操作系统 Android N 的开发者版本. ...
- android n进入分屏代码分析_Android分屏多窗口的实践代码
Android N 中推出了多窗口支持,项目要求适配多窗口模式,记录一下. 1.生命周期:对于完全没有适配多窗口的APP来说,当启用多窗口模式或者拖动窗口时,会出现Activity销毁重新加载的现象. ...
- Android多窗口分屏(原生方法)
事实上KitKat已经可以实现多窗口分屏,只是功能不全,Google并没有把这个功能提供给用户. 使用am stack boxes可以查看当前系统存在的Activity Stack: 1 am sta ...
- 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%8 ...
- 在android上启动分屏的方法
android7.0上已经支持分屏,但是国内有的手机虽然升到了7.0,但是还不能使用分屏功能. 在这种情况下,可以使用命令启动分屏, 并且是无需root的. 首先要先连接adb,不会连接的请自行百度. ...
- android如何获取分屏区域的宽高,Android N获取屏幕高度的问题
获取屏幕高度的代码 int getScreenHeight(Activity context) { WindowManager wm = (WindowManager)context.getSyste ...
- android车载系统分屏功能,超级方便:安卓7.0开启分屏功能有捷径
IT之家讯 5月19日消息,谷歌在I/O大会上放出了Android N新的开发者预览版,相较之前的版本并没有带来大的功能改进,但相信正式版最终放出时还会有更多功能添加. Android N新增的一项重 ...
最新文章
- python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
- Win2008 R2 IIS7 PHP 5.4 环境搭建图文教程
- Office的Word设置指定页码
- CRM Fiori Application top N Opportunity
- 《ASP.NET Core 3 框架揭秘(上下册)》送书结果公告
- 封装时的权限控制符区别
- 欧奈尔4个经典形态_股票K线图基础知识:图解4大经典K线组合形态
- wordpress基础插件开发3-add_action()案例研究
- echarts离线地图
- python 收银系统_实现全栈收银系统(Node+Vue)(一)
- c盘java文件误删_清理C盘误删的文件怎么恢复
- Linux alias编写
- 【云原生】Docker容器详细讲解
- 设置服务器项目用友,如何设置用友应用服务器配置
- 【CS】客户端更新(一)——更新程序文件方式
- 烟台十四位拳师荣膺“十大拳师”称号
- 【python练习】打印菱形
- 饥荒mod制作教程--植物(灌木丛)--01
- 关于枚举类的写法及应用
- Vue2 中 .env.development .env.production 详细说明
热门文章
- 实现图片点击放大预览效果
- 总结mybatis plus解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)方法
- 计算机技术浙江丽龙泉,强势“出道”!龙泉这两个项目入选浙江文旅 IP
- 英国Paper写作中有哪些写作手法?
- 大数据与人工智能:学习资源收藏
- 综合项目——智能分类垃圾桶
- 2020第二场NOIP|题解
- 工厂应该怎样规划生产品质管理?
- 如何避免头文件被重复包含?
- 360云盘关闭了怎么办 选什么网盘最靠谱