• Android 7.1.1 之实现 3D Touch


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

    感谢阅读。

  • 相关阅读:
    springboot启动流程(三)Environment简介
    JavaWeb【一、简介】
    JavaJDBC【七、JDBC升级版简介】
    JavaJDBC【六、连接池】
    JavaJDBC【五、事务】
    JavaJDBC【四、存储过程的使用】
    JavaJDBC【三、增删改查】
    JavaJDBC【二、Mysql包加载与使用】
    JavaJDBC【一、概述】
    Java注解【五、注解实战】
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7357271.html
Copyright © 2020-2023  润新知