Android 7.1.1 之实现 3D Touch

来源:互联网 发布:苹果笔记本mac有光驱吗 编辑:程序博客网 时间:2024/05/28 15:35

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

    • Shortcut概念
    • 具体实现
      • BuildConfig 配置
      • 静态配置
      • 动态配置
        • 创建
        • 删除或禁用
        • 更新
    • 返回栈问题

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>

感谢阅读!

2 1
原创粉丝点击