多窗口

在android7.0中原生提供了多窗口模式和画中画模式,多窗口模式将屏幕分为上下或左右两块区域分别显示两个应用,画中画模式主要应用在android TV中,类似于windows中的多窗口。

分屏

实现分屏功能只需要在AndroidManifest.xml中为application或特定的activity添加以下属性即可

android:resizeableActivity="true"

画中画

和分屏实现方式相同,只是需要设备支持,目前只是在android TV中有此功能,手机并没有开启该功能,需要进行特殊设置。实现方法也是在AndroidManifest.xml中为application或特定的activity添加以下属性

android:supportsPictureInPicture="true"

demo:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".TestPIPActivity"
android:supportsPictureInPicture="true" ></activity>
<activity android:name=".MainActivity"
android:resizeableActivity="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
import android.annotation.TargetApi;
import android.app.PictureInPictureParams;
import android.content.res.Configuration;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Rational;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
// 画中画 test
public class TestPIPActivity extends AppCompatActivity {
private static final String TAG = "TestPIPActivity";
private PictureInPictureParams.Builder mPictureInPictureParamsBuilder; @TargetApi(Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout content = new FrameLayout(this);
setContentView(content,new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); if(Build.VERSION.SDK_INT == Build.VERSION_CODES.O){
mPictureInPictureParamsBuilder = new PictureInPictureParams.Builder(); final TextView textView = new TextView(this);
textView.setText("test PIP");
textView.setTextSize(20);
FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
fl.gravity = Gravity.CENTER ;
textView.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {//主要操作
Rational aspectRatio = new Rational(10,10);
mPictureInPictureParamsBuilder.setAspectRatio(aspectRatio).build();
enterPictureInPictureMode(mPictureInPictureParamsBuilder.build());
}
});
content.addView(textView,fl); }else{
TextView descTv = new TextView(this);
descTv.setText("当前版本不支持...");
descTv.setTextSize(20);
FrameLayout.LayoutParams Tvfl = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
Tvfl.gravity = Gravity.CENTER ;
content.addView(descTv,Tvfl);
} } @Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
Log.d(TAG,String.valueOf(isInPictureInPictureMode));
} }

shortcut

android7.1中加入的shortcut类似于iOS的3D touch,只是将iPhone上的重按替换成了长按,长按后会弹出菜单,提供快捷操作,shortcut分为静态配置和动态配置。

静态配置

静态配置一般用于固定的选项,需要在资源文件重定义。在res下建立xml目录并新建shortcuts.xml文件,这里面定义shortcut的显示内容和跳转intent,代码如下

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="static_1"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/static_shortcut_short_name_1"
android:shortcutLongLabel="@string/static_shortcut_long_name_1" >
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.TestPIPActivity" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
  • id: shortcut的id,必须惟一,否则后面的会覆盖前面的
  • longLabel: 显示在弹出菜单中的label
  • shortLabel: 通过拖拽显示在桌面上的label
  • icon: 一个选项对应的icon
  • intent: 跳转intent,必须设置,否则会抛出java.lang.NullPointerException: Shortcut Intent must be provided的异常

之后还要在AndroidManifest中的activity中添加meta-data标签,代码如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".TestPIPActivity"
android:supportsPictureInPicture="true" ></activity>
<activity android:name=".MainActivity"
android:resizeableActivity="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts"/>
</activity>
</application> </manifest>

这样就可以通过资源文件的配置生成shortcut。需要注意的是,shortcut的数量并不能无限增加,当数量超过4时就会抛出如下异常

动态生成

动态生成shortcut由ShortcutInfo构成,ShortcutInfo有几个主要属性与静态配置相同,下面就通过ShortcutManager动态的生成两个shortcut

    private void initShortcut() {
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(this, "1")
.setShortLabel("dynamic short 1")
.setLongLabel("dynamic long 1")
.setDisabledMessage("disable")
.setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.EMPTY, this, MainActivity.class))
.build(); ShortcutInfo shortcutInfo1 = new ShortcutInfo.Builder(this, "2")
.setShortLabel("dynamic short 1")
.setLongLabel("dynamic long 2")
.setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.EMPTY, this, SecondActivity.class))
.build(); List<ShortcutInfo> shortcutInfoList = new ArrayList<>();
shortcutInfoList.add(shortcutInfo);
shortcutInfoList.add(shortcutInfo1); shortcutManager.addDynamicShortcuts(shortcutInfoList);
}
通过以上两种方法就可以在android7.1中加入快捷菜单,可以让用户在不进入应用时直接进入某个页面,实现类似iPhone中3D touch的效果。使用时也需要注意,添加数量的上限,将重要的快捷入口添加进来!

android7/8新特性 画中画、shortcut和分屏模式的更多相关文章

  1. Android7.0新特性,及Android N适配

    新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...

  2. 重新想象 Windows 8.1 Store Apps (92) - 其他新特性: CoreDispatcher, 日历, 自定义锁屏系列图片

    [源码下载] 重新想象 Windows 8.1 Store Apps (92) - 其他新特性: CoreDispatcher, 日历, 自定义锁屏系列图片 作者:webabcd 介绍重新想象 Win ...

  3. Android N分屏模式Activity生命周期的变化

    昨天Google发布了Android N Preview, balabala....我是用模拟器去验证的, 通过长按多任务窗口(口)进入分屏模式, 这里只进行了简单的测试, 不排除通过配置哪个参数, ...

  4. Android7.0 新特性

    删除了三个隐式广播 1.监听网络变化的广播 CONNECTIVITY_ACTION,在Manifest.xml中注册的 不会受到,在前台运行的程序 registerReceiver()注册的广播可以接 ...

  5. FineUIMvc新特性速递(大间距模式,隐藏菜单垂直滚动条)

    即将发布的 FineUIMvc 新版本会引入两个重要的特性,用来提升用户体验,现在就来先睹为快吧: 大间距模式 我们已经支持的显示模式有:紧凑模式,普通模式,大字体模式. 紧凑模式: 普通模式: 大字 ...

  6. Android N(7.0) 被美翻的新特性!

    Tamic 专注移动开发!更多文章请关注 Csdn: http://blog.csdn.net/sk719887916/article/details/52612444 $ http://www.ji ...

  7. ios9和ios10的新特性

    昨天面试了一个做ios开发的公司,其中面试官问我最新的ios系统版本是多少,以及它的特性是什么?由于自己是初学者,所以对这些没有关注过.今天特地搜索了一下关于ios9和ios10的新特性,并整理了一下 ...

  8. iOS开发——新特性OC篇&IOS9 SDK新特性

    iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...

  9. Android 7.0(牛轧糖)新特性

    Android 7.0(牛轧糖)新特性 谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息.目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan A ...

随机推荐

  1. 爬取前程无忧网站上python的招聘信息。

    本文获取的字段有为职位名称,公司名称,公司地点,薪资,发布时间 创建爬虫项目 scrapy startproject qianchengwuyou cd qianchengwuyou scrapy g ...

  2. PAT 甲级 1025.PAT Ranking C++/Java

      Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Z ...

  3. 图论篇3——最短路径 Dijkstra算法、Floyd算法

    最短路径 问题背景:地图上有很多个城市,已知各城市之间距离(或者是所需时间,后面都用距离了),一般问题无外乎就是以下几个: 从某城市到其余所有城市的最短距离[单源最短路径] 所有城市之间相互的最短距离 ...

  4. SpringBoot——SpringBoot学习记录【一】

    前言 公司目前主要的业务,用的语言是java,所以学习下相关的技术呀,还好大学基础语言学的JAVA SpringBoot简介 官网 SpringBoot 简介 SpringBoot是用来简化Sprin ...

  5. XCOPY——目录复制命令

    XCOPY——目录复制命令 1.功能:复制指定的目录和目录下的所有文件连同目录结构. 2.类型:外部命令 3.格式:XCOPY [源盘:]〈源路径名〉[目标盘符:][目标路径名][/S][/V][/E ...

  6. 大文件上传控件webupload插件

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  7. EF core 性能调优

    Entity Framework Core performance tuning – a worked example Last Updated: February 25, 2019 | Create ...

  8. [RN] React Native 分享弹窗 ShareAlertDialog

    React Native 分享弹窗 ShareAlertDialog ShareAlertDialog.js文件 /** * 分享弹窗 */ import React, {Component} fro ...

  9. 【搜索】$P1092$虫食算

    题目链接 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同 ...

  10. 洛谷 P2040 打开所有的灯 题解

    这个题写其他题解的dalao们已经解释了 一个灯最多开一次(如果实在不知道为什么看评论区) 这个题一共就9个灯嘛,对吧 递归好想不好写(对于我这种蒟蒻) 所以我写了一个所有题解中最暴力的 直接枚举9个 ...