Android 7.1.1 之实现 3D Touch

转载请注明出处: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<>(); // 按下返回button跳转的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>

感谢阅读。

$(function () {
$(‘pre.prettyprint code‘).each(function () {
var lines = $(this).text().split(‘\n‘).length;
var $numbering = $(‘

    ‘).addClass(‘pre-numbering‘).hide();
    $(this).addClass(‘has-numbering‘).parent().append($numbering);
    for (i = 1; i <= lines; i++) {
    $numbering.append($(‘

  • ‘).text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

相关文章