Androd7.0-新特性

##Android7.0多窗口

Android N添加了同时显示多个应用窗口的支持,在手持设备上,两个应用可以在“分屏”模式中左右并排或上下并排显示。 在电视设备上,应用可以使用“画中画”模式,在用户与另一个应用交互的同时继续播放视频。

本文将在多窗口配置应用、多窗口变更通知和查询、多窗口的拖放功能来讲述。

在讲解多窗口的时候先附上在模拟器打开自由状态模式方便查看演示效果:

(1)运行adb remount

(2)运行adb shell

(3)chmod 777 system

(4)运行cd /system/etc/permissions

(5)运行sed -e "s/live_mallpaper/freeform_window_management/" android.software.live_wallpaper.xml >freeform.xml

完毕之后如果能在模拟器实现这种操作便成功了

一、多窗口的配置应用

1、应用支持多窗口的功能

        <!--
            resizeableActivity="false" 设置为false表明该Activity不支持分屏操作,当用户尝试分屏操作时则以全屏进行显示
            supportsPictureInPicture="true" Activity是否支持画中画的显示,如果resizeableActivity为false则忽略这项
        -->
        <activity
            android:name=".config.ConfigMultiActivity01"
            android:resizeableActivity="false"
            android:supportsPictureInPicture="true"
            android:taskAffinity="" />

当你设置resizeableActivity=false 的时候,运行点击分屏操作则显示:

2、布局属性

在Android N 中activity标签下支持layout标签用来设置在自由状态模式下Activity的宽高和位置。

        <activity
            android:name=".config.ConfigMultiActivity02"
            android:taskAffinity="">

            <!--
                defaultHeight:自由形状模式下默认高度
                defaultWidth:自由形状模式下默认宽度
                gravity:Activity启动时初始位置
                minHeight:自由形状模式和分屏模式下最小高度
                minWidth:自由形状模式和分屏模式下最小宽度
            -->
            <layout
                android:defaultHeight="200dp"
                android:defaultWidth="350dp"
                android:gravity="top|left"
                android:minHeight="150dp"
                android:minWidth="300dp" />
        </activity>

效果:

3、在多窗口启动新的Activity

在Android7.0提供了在多窗口启动Activity用来共享屏幕,只需要在启动的Intent加上FLAG_ACTIVITY_LAUNCH_ADJACENT即可。

        Intent intent = new Intent(this, ConfigMultiActivity04.class);
        //系统会尝试在临近Activity附近启动,这样两个Activity将共享屏幕,系统不一定能实现这个操作,
        //但如果可以系统则将这两个Activity处于相邻的位置
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
        startActivity(intent);

效果:

可以看到当移动的时候会有一个背景,这个背景也是自己来定义的。

        <!--
            在分屏模式下,放大尺寸运行时将会使用下面的颜色进行填充,
            windowBackground或windowBackgroundFallback,经过测试发现只有windowBackground起作用
        -->
        <item name="android:windowBackground">@color/colorAccent</item>
        <item name="android:windowBackgroundFallback">@color/colorAccent</item>

如果处于自由状态模式下,则启动新的Activity可通过 ActivityOptions.setLaunchBounds()来指定新Activity的尺寸和位置,如果不处于多窗口模式下则无效,设置如下:

        /*
            如果设备处于自由形状模式,则在启动新 Activity 时,用户可通过调用 ActivityOptions.setLaunchBounds()
            指定新 Activity 的尺寸和屏幕位置。 如果设备不处于多窗口模式,则该方法无效。
         */
        Rect bound = new Rect(330, 130, 400, 400);
        ActivityOptions options = ActivityOptions.makeBasic();
        options.setLaunchBounds(bound);
        startActivity(intent, options.toBundle());

效果:

二、多窗口变更通知与查询

变更的通知则有Activity来监听,所以只需要重写下面的方法即可:

        /*
            Activity.isInMultiWindowMode()
            调用该方法以确认 Activity 是否处于多窗口模式。
            Activity.isInPictureInPictureMode()
            调用该方法以确认 Activity 是否处于画中画模式。
         */
    }
    @Override
    public void onMultiWindowModeChanged(boolean isInMultiWindowMode) {
        super.onMultiWindowModeChanged(isInMultiWindowMode);
        /**
         * Activity进入或退出模式时,系统调用此方法,进入是isInMultiWindowMode为true
         */
        if(isInMultiWindowMode) {
            Toast.makeText(this, "enter the MultWindow", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "exit the MultWindow", Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode);
        /**
         * Activity进入画中画或退出画中画的时候调用,进入isInPictureInPictureMode为true
         */
        if(isInPictureInPictureMode) {
            Toast.makeText(this, "enter the pictureInPicture", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "exit the pictureInPicture", Toast.LENGTH_SHORT).show();
        }
    }

效果:

三、多窗口的拖放功能

在Android N中用户可以在Activity共享屏幕的同时之间拖放数据。

在Activity01为ImageView添加长按事件

iv.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                ClipData.Item item = new ClipData.Item(v.getTag().toString());
                //创建一个新的clipData使用tag作为label,这个MIME设置文本,
                // 它将创建一个新的ClipDescription对象包含这个ClipData
                ClipData dragData = ClipData.newPlainText(IMAGEVIEW_TAG, "这是DragActivity01的数据");
                // 初始化拖拽阴影
                View.DragShadowBuilder myShadow = new MyDragShadowBuilder(iv);
                // 开始进行拖拽
                v.startDragAndDrop(dragData,  // 将要拖拽的数据
                        myShadow,  // ShadowBuilder
                        null,      // 不需要本地数据
                        View.DRAG_FLAG_GLOBAL          // 没有则设置为0,如果是跨Activity进行拖放则使用View.DRAG_FLAG_GLOBAL
                        //如果需要对Activity拖放授予URI权限则使用DRAG_FLAG_GLOBAL_URI_READ和DRAG_FLAG_GLOBAL_URI_WRITE
                );
                return false;
            }
        });

接下来你只需要在Activity02中为控件设置拖放监听即可

       myDragEventListener mDragListen = new myDragEventListener();
        drag02_iv.setOnDragListener(mDragListen);
    }

    protected class myDragEventListener implements View.OnDragListener {
        public boolean onDrag(View v, DragEvent event) {
            final int action = event.getAction();
            DragActivity02.this.requestDragAndDropPermissions(event);//请求DragEvent 中包含的 ClipData传递URI的权限。
            switch (action) {
                case DragEvent.ACTION_DRAG_STARTED:
                    //判断这个View是否可以接受拖拽的数据
                    if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                        v.setBackgroundColor(Color.BLUE);//被接收的View设置蓝色
                        v.invalidate();
                        return true;//返回true表明这个View可以接受这个拖拽的数据
                    }
                    return false;//返回false说明在当前拖拽的操作,这个View不会再次接收这事件直到ACTION_DRAG_ENDED被调用
                case DragEvent.ACTION_DRAG_ENTERED:
                    v.setBackgroundColor(Color.GREEN);
                    v.invalidate();
                    return true;
                case DragEvent.ACTION_DRAG_LOCATION:
                    return true;
                case DragEvent.ACTION_DRAG_EXITED:
                    v.setBackgroundColor(Color.BLUE);
                    v.invalidate();
                    return true;
                case DragEvent.ACTION_DROP:
                    //从DragEvent中得到拖拽的Item
                    ClipData.Item item = event.getClipData().getItemAt(0);
                    //从这个Item中得到文本数据
                    String dragData = (String) item.getText();
                    Toast.makeText(DragActivity02.this, "Dragged data is " + dragData, Toast.LENGTH_LONG).show();
                    v.invalidate();
                    return true;

                case DragEvent.ACTION_DRAG_ENDED:
                    v.setBackgroundColor(Color.parseColor("#888888"));
                    v.invalidate();
                    if (event.getResult()) {
                        Toast.makeText(DragActivity02.this, "The drop was handled.", Toast.LENGTH_LONG).show();

                    } else {
                        Toast.makeText(DragActivity02.this, "The drop didn't work.", Toast.LENGTH_LONG).show();

                    }
                    return true;
                default:
                    break;
            }

            return false;
        }

效果:

时间: 2024-10-11 16:21:19

Androd7.0-新特性的相关文章

Day07 jdk5.0新特性&Junit&反射

day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装MyEclipse 先安装了JDK ? MyEclipse介绍 ? MyEclipse是Eclipse的一个插件: MyEclipse是需要花钱的: MyEclipse官网不在欢迎中国人登录: ? MyEclipse使用 ? 1 创建项目 选择工作空间: 工作空间路径不能有空格和中文: 工作空间以班名

Atitit.&#160;C#.net&#160;clr&#160;2.0&#160;&#160;4.0新特性

Atitit. C#.net clr 2.0  4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1.  托管与本地代码的互操作5 4.1.2.    垃圾回收6 4.1.3.    代码约定6 4.1.4.    Corrupted state exception6 4.1.5.     新的安全模型7 4.1.6.     同一个进程,多个CLR7 4.1.7.     基本类库7 5. CLR最新发展8 6

day07 MyEclipse 安装 jdk5.0 新特性

1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具    * myeclipse:是一个收费的插件,破解myeclipse,        ** 安装目录的要求: 不能有中文和空格        ** 安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格    * 破解myeclipse        ** 运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 * myeclipse的使用        * 创建一个工程          

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼     AFNetworking 2.0 相比1.0 API 接口改动还是很大的. 其中一个便是 AFURLSessionManager,当然如果你不太熟悉,或者为了兼容低版本,你依然可以选择AFHTTPRequestOperationManager,AFURLSessionManager是基于 NSURLSessionConfiguration(IOS 7

Servlet 3.0 新特性详解

转自:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性详解 张 建平2010 年 4 月 23 日发布 WeiboGoogle+用电子邮件发送本页面 6 Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其

android 7.0 新特性 和对开发者的影响

android 7.0新特性 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/52411300 android 7.0对开发者会有哪些影响 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/52411353 android 7.0 多窗口及新特性demo - jiabail

C#6.0新特性

C#6.0新特性怎么用 系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 前文提到过一个神器叫Resharper,功能强大,编码效率和代码质量那是蹭蹭的涨,但是神器的最大问题是太耗费资源了,每次系统提示内存不足的时候,那叫一个纠结啊.因此每次新的VS发布的时候都情不自禁的查看是否增强编辑功能,情不自禁的讨论一番,这次VS2015也不例外. 去年微软放出Roslyn的时候,微软就曾经放出过一个“尝鲜”版的VS编辑增强功能,恰恰就是重构(reflector),话说这

ASP.NET MVC—1、前期知识储备(C#3.0新特性)

在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特性将会大大的提高我们的开发效率,同时,在MVC项目中你将到处可以看到C#3.0新特性的身影. C#3.0新特性 自动属性 隐式类型 var 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 自动属性 这个概念很简单,其简化了我们在.NET的时候手写一堆私有成员+属性的编程方式,我们只需要使用如下方式声明一个属性,编译器会自动生成所需的成员变量

Spark1.0.0新特性

Spark1.0.0 release于2014-05-30日正式公布,标志Spark正式进入1.X的时代.Spark1.0.0带来了各种新的特性,并提供了更好的API支持:Spark1.0.0添加了Spark SQL这一个新的重要组件,用于载入和操作Spark的结构化数据:Spark1.0.0增强了现有的标准库(ML,streaming,GraphX),同一时候还增强了Java和Python语言的支持:最后,Spark1.0.0在运维上做了非常大的改进,包含支持Hadoop/YARN安全机制.使

Hadoop 2.4.0新特性介绍

在2014年4月7日,Apache发布了Hadoop 2.4.0 .相比于hadoop 2.3.0,这个版本有了一定的改进,突出的变化可以总结为下列几点(官方文档说明): 1 支持HDFS访问控制列表(ACL,Access Control Lists) 这个特性解决了在一定情况下,文件权限访问的权限问题.其机制是基于Linux文件访问权限的特征,如果你熟悉Linux的文件访问机制,你就不用再去理解HDFS文件访问的特性了. 有了ACL特性后,对HDFS文件系统就具有了良性的扩展特性.HDFS-4