Android 7.1.1 之实现 3D Touch

标签: android 3d-touh shortcut 快捷方式
6114人阅读 评论(3) 收藏 举报
分类:

转载请注明出处:http://blog.csdn.net/yyh352091626/article/details/68962736

Shortcut概念

Shortcut 是Android-25(Android 7.1)新增的一项类似iOS的 3D Touch 功能的快捷方式组件,但是有着不同的表现形式,因为Android在硬件上不支持触摸压力感应,所以表现形式为长按,而iOS须用力长按。

首先,来个效果图

   

在 Launcher 或 应用程序列表 里面,长按应用图标,弹出一个快捷方式列表, 并且,可以把单个快捷方式拖动出来作为一个桌面图标,拖出来的图标会随着清除应用数据或卸载应用而消失,须重新创建。

具体实现

BuildConfig 配置

在主module下,修改 build.grade,使其使用 android-25 的 API 编译,当然,未下载的,就需要打开Android SDK Manager下载一下。

android {
    compileSdkVersion 25 
    buildToolsVersion "25.0.0" // 或以上

    defaultConfig {
        targetSdkVersion 25
    }
}

静态配置

类似BroadCastReceiver,Shortcut注册也分为静态注册和动态注册,首先介绍静态注册,动态注册后面继续~~

  1. res/xml 文件夹底下创建一个xml,举个栗子:shortcut.xml

    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:enabled="true"
        android:icon="@mipmap/ic_bar_detail_write"
        android:shortcutDisabledMessage="@string/shortcut_publish"
        android:shortcutId="publish"
        android:shortcutLongLabel="@string/shortcut_publish"
        android:shortcutShortLabel="@string/shortcut_publish">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.yanshi.writing.ui.bar.PublishPostActivity"
            android:targetPackage="com.yanshi.writing" />
        <categories android:name="android.shortcut.conversation" />
    </shortcut>
    
    <shortcut
        android:enabled="true"
        android:icon="@mipmap/logo"
        android:shortcutDisabledMessage="@string/shortcut_write"
        android:shortcutId="write"
        android:shortcutLongLabel="@string/shortcut_write"
        android:shortcutShortLabel="@string/shortcut_write">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.yanshi.writing.ui.write.WriteActivity"
            android:targetPackage="com.yanshi.writing" />
        <categories android:name="android.shortcut.conversation" />
    </shortcut>
    </shortcuts>

    1、enabled:表示当前快捷方式是否可使用
    2、 icon: 快捷方式图标
    3、 shortcutDisabledMessage: 快捷方式不可使用时显示的名字
    4、 shortcutId:快捷方式标识
    5、 shortcutLongLabel:长按下图标弹出来列表框中每个快捷名
    6、 shortcutShortLabel:快捷是可以单独显示在桌面上的,显示名为shortcutShortLabel
    7、 targetClass:点击快捷方式进入的Activity
    8、categories 默认写死即可

  2. 清单文件注册
    在 AndroidMainfest.xml 的默认启动页里添加 meta-data 标签配置

    <activity
            android:name=".ui.MainActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoneTranslucent">
            <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/shortcut" />
        </activity>
  3. 完毕! 可以到桌面查看效果了~~

动态配置

动态创建增加了菜单配置的灵活性,比如可以从服务端拉取快捷方式列表,再进行展示。具体配置方法如下:

创建

在需要注册的地方添加如下代码:

/**
  * 动态创建
  */
 public void register() {
     ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
     List<ShortcutInfo> infos = new ArrayList<>();

     // 按下返回按钮跳转的activity
     Intent intent1 = new Intent(this, MainActivity.class);
     intent1.setAction(Intent.ACTION_VIEW);

     // 目标activity
     Intent intent2 = new Intent(this, PublishPostActivity.class);
     intent2.setAction("com.yuyh.xxx.BACK");

     Intent[] intents = new Intent[2];
     intents[0] = intent1;
     intents[1] = intent2;

     ShortcutInfo info = new ShortcutInfo.Builder(this, "publish-2")
             .setShortLabel("动态创建-发布帖子")
             .setLongLabel("动态创建-发布帖子")
             .setIcon(Icon.createWithResource(this, R.mipmap.ic_bar_detail_write))
             .setIntents(intents)
             .build();
     infos.add(info);

     mShortcutManager.setDynamicShortcuts(infos);
 }

重新运行app,再次长按,效果如下:

删除或禁用

动态删除可以删除动态配置的快捷方式。

/**
 * 动态删除
 */
public void delete() {

    ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);

    /********* 移除弹出列表图标 **********/
    // 所有动态创建图标
    List<ShortcutInfo> infos1 = mShortcutManager.getDynamicShortcuts();

    List<String> ids1 = new ArrayList<>();
    for (ShortcutInfo info : infos1 ) {
        ids1.add(info.getId());
    }

    // 禁用所有的快捷方式
    mShortcutManager.disableShortcuts(ids1, "已禁用");
    mShortcutManager.removeDynamicShortcuts(ids1);

    /********* 移除拖出来的桌面快捷图标 **********/
    // 放在桌面的图标
    List<ShortcutInfo> infos2 = mShortcutManager.getPinnedShortcuts();

    List<String> ids2 = new ArrayList<>();
    for (ShortcutInfo info : infos2 ) {
        ids2.add(info.getId());
    }

    mShortcutManager.disableShortcuts(ids2, "已禁用");
    mShortcutManager.removeAllDynamicShortcuts();
}

代码比较简单,就不多做叙述了。 须注意一下 getPinnedShortcuts 方法与 getDynamicShortcuts 方法的区别! 禁用后的效果如图所示,图标变成灰色:

更新

快捷方式的唯一性,由前面提到的 shortcutId 这个标识符决定,所以更新快捷方式与创建快捷方式一样, shortcutId 如果相同, 则会覆盖之前创建的快捷方式!

返回栈问题

当通过快捷方式打开时,现有的Activity都会被销毁,然后重新创建一个Activity栈。因为清单方式设置的快捷键的Intent不能自定义Intent的Flag,其默认的Flag是 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK

通过动态注册的方式,可发现,我们可以配置返回目标activity。当然,静态配置也可以实现,修改shortcut标签:

<shortcut
     android:enabled="true"
     android:icon="@mipmap/ic_bar_detail_write"
     android:shortcutDisabledMessage="@string/shortcut_publish"
     android:shortcutId="publish"
     android:shortcutLongLabel="@string/shortcut_publish"
     android:shortcutShortLabel="@string/shortcut_publish">

     <!-- 返回目标activity -->
     <intent
         android:action="com.yuyh.xxx.BACK"
         android:targetClass="com.yanshi.writing.ui.MainActivity"
         android:targetPackage="com.yanshi.writing" />

     <!-- 目标activity -->
     <intent
         android:action="android.intent.action.VIEW"
         android:targetClass="com.yanshi.writing.ui.bar.PublishPostActivity"
         android:targetPackage="com.yanshi.writing" />
     <categories android:name="android.shortcut.conversation" />
 </shortcut>

感谢阅读!

查看评论

Android-实现类似3DTouch菜单功能

前言在开发中,我们经常遇到需要菜单功能的实现,我们经常会参考其他人的优秀设计。比如3D Touch菜单,作为iphone6和iphone6s上引人注目的新功能。现在,我们希望尽力来模仿这种菜单设计,尽...
  • z82367825
  • z82367825
  • 2016-10-31 00:12:24
  • 3217

Android App 快捷方式之 Android 版本的 3D Touch

Android 版本的 3D TOUCH
  • yang786654260
  • yang786654260
  • 2016-12-01 20:32:56
  • 1279

Android OpenGL显示任意3D模型文件

前面两篇文章我们介绍了OpenGL相关的基本知识,现在我们已经会绘制基本的图案了,但是还远远不能满足我们的需求。我们要做的是显示任意的模型,这也是本文所要做的事情。在阅读本文之前,请先确保你已经看过我...
  • huachao1001
  • huachao1001
  • 2016-07-29 15:44:07
  • 15612

Android中利用Camera与Matrix实现3D效果详解

本文行文目录: 一、Camera与Matrix初步认识 二、Camera与Matrix旋转效果拆分介绍 三、Camera与Matrix...
  • zhangke3016
  • zhangke3016
  • 2016-08-02 14:15:40
  • 12516

android camera 3d特效 详解与进阶

1 概述本篇主要讲解camera,这里的camera并不是照相相关的类,而是android.graphics.Camera,这个类中封装了一个matrix,不熟悉的同学可以看前面的文章来了解。andr...
  • cquwentao
  • cquwentao
  • 2016-05-20 16:55:49
  • 4776

Android 自定义控件之---3D画廊

一、效果图:二、首先实现基本的框架1、创建一个类继承Gallerypublic class GalleryView extends Gallery { public GalleryView(Co...
  • lovoo
  • lovoo
  • 2016-06-05 21:29:40
  • 5647

Android开发3D界面特效

Android开发3D界面特效 分类: Android 2012-09-25 17:29 1169人阅读 评论(1) 收藏 举报 androidtransformatio...
  • u010509143
  • u010509143
  • 2013-08-16 16:34:41
  • 985

Android之3D物理引擎

Android之3D物理引擎 Android下有很多优秀的3D物理引擎,如alien3d,gamine,jpct等,今天,我们介绍如何使用jpct(选这个引擎是因为它的官网上的Demo和...
  • htttw
  • htttw
  • 2012-05-24 16:35:35
  • 10972

android手机裸眼3D技术原理和编程实现

1.裸眼3D手机从去年开始流行。做为一个卖点或者噱头,为手机的输入输出提供一抹灵动的色彩。裸眼3D可以在二维的手机屏幕上不需要配戴VR眼镜或者谷歌纸盒就能展示三维的世界的效果,一般来说要给用户提供好的...
  • blogercn
  • blogercn
  • 2017-05-19 00:46:23
  • 4168

Android 3D开发,OpenGL ES 的使用(一)

最近有人问OpenGL ES 的使用,我通过几行代码演示一下。 不需要将来源历史或大篇前奏。。 通过短短的一段就能迅速理解OpenGL ES 初步使用方法,对OpenGL ES 有了大概的概念和感知。...
  • gfg156196
  • gfg156196
  • 2017-03-09 00:56:52
  • 630
    个人资料
    等级:
    访问量: 81万+
    积分: 6144
    排名: 5078