前因后果

苹果在iPhone 6s和iPhone 6s Plus开始新增了3D Touch,这个功能褒贬不一,但我觉得还是特别好用的,特别是在微信上付款、加好友、扫二维码,或是在支付宝上付款等等场景。好用的真的是不要不要的,下面是苹果3D Touch的截图:

这么好用的功能安卓能不模仿吗?呸!能不实现吗?

从安卓7.1(25)开始,系统新增了Shortcut来实现类似苹果3D Touch的功能,实现效果如下:

苹果的3D Touch是通过检测手指按压力度来判断是否弹出,安卓硬件没办法统一,所以统一采用长按的方式来实现。

开始实现

实现呢,一共有三种方式,安卓官方是这样来描述的:

我就用官方直译来翻译下凑合理解吧:

创建快捷方式

快捷方式可帮助用户快速访问应用程序的各个部分,从而为用户提供特定类型的内容。

使用快捷方式交付内容的方式取决于您的用例以及快捷方式的上下文是应用程序驱动还是用户驱动。尽管静态快捷方式的上下文不会更改,而动态快捷方式的上下文会不断更改,但是在两种情况下,上下文都是由您的应用程序驱动的。如果用户选择自己希望您的应用向其交付内容的方式(例如固定快捷方式),则上下文由用户定义。以下方案演示了每种快捷方式类型的一些用例:

  • 静态快捷方式 最适合在用户与应用程序互动的整个生命周期中使用一致结构链接到内容的应用程序。由于大多数启动器一次 只能显示四个快捷方式,因此静态快捷方式对于常见活动很有用。例如,如果用户希望以特定方式查看其日历或电子邮件,则使用静态快捷方式可确保他们执行例行任务的经验是一致的。
  • 动态快捷键 用于上下文相关的应用程序中的操作。例如,如果您构建的游戏允许用户在启动时从其当前级别开始,则快捷方式将需要经常更新。使用动态快捷方式允许每次用户清除级别时更新该快捷方式。
  • 固定的快捷方式 用于特定的,用户驱动的操作。例如,用户可能想要将特定网站固定到启动器。这是有好处的,因为与使用浏览器的默认实例相比,它使用户可以更快地执行自定义操作,例如一步导航到网站。

静态快捷方式

1、在AndroidManifest.xml中找见你的启动项Activity,在其中添加一个元素,该元素引用定义了应用程序快捷方式的资源文件:

        <activity android:name=".MainActivity"><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/shortcuts" /></activity>

2、上面的shortcuts文件详情如下,其中定义了基本参数和意图:

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"><shortcutandroid:enabled="true"android:icon="@drawable/one"android:shortcutDisabledMessage="@string/static_disabled_message"android:shortcutId="staticId"android:shortcutLongLabel="@string/static_shortcut_long_label"android:shortcutShortLabel="@string/static_shortcut_short_label"><categories android:name="android.shortcut.conversation" /><intentandroid:action="android.intent.action.VIEW"android:targetClass="com.zj.shortcut.Main2Activity"android:targetPackage="com.zj.shortcut" /></shortcut>
</shortcuts>

3、上面的文件中有很多的属性,下面来一一讲解一下:

  • android:shortcutId 和 android:shortcutShortLabel 是必填值,其他都是可选的。
  • android:shortcutId 字符串文字,表示对象对其执行操作时的快捷方式。
  • android:shortcutShortLabel 简短的描述,描述了快捷方式的用途。尽可能将快捷方式的“简短描述”的长度限制为10个字符,不然在手机上显示效果可能不太好。
  • android:shortcutLongLabel  描述该快捷方式用途的扩展短语。如果有足够的空间,启动器将显示此值而不是上面的简短的描述。如果可能,将快捷方式的“详细描述”的长度限制为25个字符。
  • android:shortcutDisabledMessage  当用户尝试启动禁用的快捷方式时,在受支持的启动器中显示的消息。该消息应向用户说明为什么现在禁用了快捷方式。如果android:enabled为,则此属性的值无效true
  • android:enabled   确定用户是否可以与受支持的启动器中的快捷方式进行交互。默认值android:enabledtrue。如果将其设置为false,则还应该设置一个android:shortcutDisabledMessage,以说明为什么禁用了快捷方式。如果您不需要提供这样的消息,则最简单的方法是从XML文件中完全删除快捷方式。
  • android:icon   启动器在向用户显示快捷方式时使用 的位图 或 自适应图标。该值可以是图像的路径,也可以是包含该图像的资源文件。尽可能使用自适应图标来提高性能和一致性。

4、上面的字符串都定义在了res->value->string.xml中,下面是代码:

    <string name="static_disabled_message">测试信息</string><string name="static_shortcut_long_label">测试长标题</string><string name="static_shortcut_short_label">测试短标题</string>

5、下面来看一下静态展示安卓的“3D Touch”:

动态快捷方式

1、动态快捷键提供了指向应用程序中特定于上下文的特定操作的链接。这些操作可能会在您的应用使用之间发生变化,甚至在应用运行时也会发生变化。动态快捷方式的选择包括呼叫特定人员,导航至特定位置以及从用户的最后保存点加载游戏等等。

这是ShortcutManagerAPI的地址https://developer.android.google.cn/reference/android/content/pm/ShortcutManager.html

  • 发布:使用 setDynamicShortcuts()重新定义动态快捷键的完整列表,或者使用 addDynamicShortcuts() 以增加动态快捷键的现有列表。
  • 更新:使用 updateShortcuts()方法。
  • 删除:使用删除一组动态快捷方式 removeDynamicShortcuts(),或使用 删除所有动态快捷方式 removeAllDynamicShortcuts()

2、下面是动态添加快捷方式的代码(注意要加版本注解):

@TargetApi(Build.VERSION_CODES.N_MR1)@RequiresApi(Build.VERSION_CODES.M)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val shortcutManager = getSystemService<ShortcutManager>(ShortcutManager::class.java)val shortcut = ShortcutInfo.Builder(this, "id1").setShortLabel("Website").setLongLabel("Open the website").setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_background)).setIntent(Intent(Intent.ACTION_VIEW,Uri.parse("https://www.baidu.com/"))).build()shortcutManager!!.dynamicShortcuts = listOf(shortcut)}

3、下面是添加完之后运行界面样式:

固定快捷方式

在Android 8.0(API级别26)及更高版本上,可以创建固定的快捷方式。与静态和动态快捷方式不同,固定的快捷方式在支持的启动器中显示为单独的图标。图1显示了这两种快捷方式之间的区别。

1、使用 isRequestPinShortcutSupported()验证应用程序内设备的默认启动支持快捷键。

2、ShortcutInfo根据快捷方式是否已存在,以两种方式之一创建对象:

  • 如果快捷方式已经存在,请创建一个 ShortcutInfo仅包含现有快捷方式ID的对象。系统会自动查找并固定与快捷方式相关的所有其他信息
  • 如果要固定新的快捷方式,请创建一个ShortcutInfo对象,其中包含新快捷方式 的ID,意图和简短标签。
  • 注意:因为系统会自动对固定的快捷方式执行 备份和还原,所以这些快捷方式的ID应该包含稳定,恒定的字符串或服务器端标识符,而不是本地生成的标识符,这些标识符在其他设备上可能没有意义。

3、通过调用将快捷方式固定到设备的启动器 requestPinShortcut()。在此过程中,可以传入一个 PendingIntent对象,该对象仅在成功固定快捷方式后才通知应用。

           注意:如果用户不允许将快捷方式固定在启动器上,则您的应用不会收到回调。固定快捷方式后,可以使用 updateShortcuts()方法更新其内容 。

4、下面是创建固定快捷方式的代码:

@SuppressLint("NewApi")private fun initShortcut() {val shortcutManager = getSystemService(ShortcutManager::class.java)if (shortcutManager!!.isRequestPinShortcutSupported) {val pinShortcutInfo  = ShortcutInfo.Builder(this, "id1").setShortLabel("Website").setLongLabel("Open the website").setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_background)).setIntent(Intent(Intent.ACTION_VIEW,Uri.parse("https://www.baidu.com/"))).build()val pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo)val successCallback = PendingIntent.getBroadcast(this, /* request code */ 0,pinnedShortcutCallbackIntent, /* flags */ 0)shortcutManager.requestPinShortcut(pinShortcutInfo,successCallback.intentSender)}}

5、运行结果如下:

文末

本文参照了官网Shortcut的介绍及使用,本文涉及所有代码均可联系我获取。

欢迎大家关注我的个人公众号,会定期发布安卓、Java学习及搞笑文章。

你知道安卓的3D Touch吗?(Shortcut详解,你想知道的我都有)相关推荐

  1. 《Unity 3D 游戏开发技术详解与典型案例》——1.3节第一个Unity 3D程序

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.3节第一个Unity 3D程序,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  2. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  3. 【备注】【C24】《Android 3D游戏开发技术详解与典型案例》PDF 下载

    [C24]<Android 3D游戏开发技术详解与典型案例>PDF 下载 目前市面上的Android技术书籍还比较少,Android3D游戏开发的书籍更是没有.因此,在现在市面上,Andr ...

  4. 安卓camera2 API获取YUV420_888格式详解

    安卓音视频开发中的一个环节是摄像头采集数据,Android平台上摄像头采集的API有两套,camera1和camera2.本文主要讲的是camera2这套API采集数据,并指明YUV420_888格式 ...

  5. Android 3D游戏开发技术详解与典型案例

    下载地址 <Android3D游戏开发技术详解与典型案例>主要以Android平台下3D游戏的开发为主题,并结合真实的案例向读者详细介绍了OpenGL ES的基础 知识及3D游戏程序开发的 ...

  6. android 跳转oppo应用中心_安卓市场—OPPO应用市场ASO详解

    即日枢纽的是OPPO运用商场从上架之前到上架之后的全过程安排. 一.运用商场里面搞预 开始上架之前须要搞的几步安排,领会商场,领会竞品,树立本人的闭头词汇库.(这些安排上几篇文章已经道过,不再过多论述 ...

  7. 安卓市场和安智市场_安卓市场—OPPO应用市场ASO详解

    本文由鸟哥笔记春羽计划出品本文2042字今天要讲的是OPPO应用市场从上架之前到上架之后的全过程操作.应用市场内部干预首先上架之前需要干的几步操作,分析市场,分析竞品,建立自己的关键词库.(这些操作上 ...

  8. android刷ios,安卓刷ios方法教程【详解】

    ios操作系统的流畅度非常的高,因此人们都愿意购买 苹果 的手机.大家都知道苹果智能手机的售价是非常昂贵的,并不是社会上每一个人都可以负担得起的.有非常多的消费者为了可以达到非常好的操作体验,因此有非 ...

  9. Android 3D游戏开发技术详解与典型案例pdf

    下载地址:网盘下载 <Android3D游戏开发技术详解与典型案例>主要以Android平台下3D游戏的开发为主题,并结合真实的案例向读者详细介绍了OpenGL ES的基础知识及3D游戏程 ...

最新文章

  1. 轮播图最后一张图结束如何平缓回到第一张_产品经理早期如何学习?
  2. Oracle 执行计划
  3. 基于NHibernate的三层结构应用程序开发初步
  4. 【BZOJ3196】Tyvj 1730 二逼平衡树
  5. 【正一专栏】从中超走向世界领先的保利尼奥
  6. 搭建 Hadoop2.7.2 + Spark1.6环境
  7. git status 不能显示中文
  8. dotnet 是 前30个增长最快速度的开源项目中排名第一的开发平台
  9. java商城购物车商品sku变化_在Woocommerce 3中的购物车和结帐页面上显示SKU
  10. 诺基亚指控联想侵权;格力回应“被中国移动取消中标资格”;微软暂停更新 Edge 浏览器 | 极客头条...
  11. 【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)
  12. python库-密码学库pynacl
  13. 罗技鼠标的蓝牙适配器无效的解决办法
  14. 题解 伊甸园日历游戏
  15. 【机器视觉硬件】机器视觉硬件学习笔记2——工业相机
  16. 怎样把一张图片插入到CAD图纸中呢?
  17. 【Git学习笔记二】时光穿梭机
  18. 综述 | 图像计算传感器
  19. Java Web高级面试题(二)
  20. java实现端口映射_Java BIO实现TCP端口转发(端口映射)功能源码

热门文章

  1. 设计评审CheckList
  2. 用友远程命令执行漏洞并提权
  3. IE8 RC版 兼容模式的表格边框问题
  4. Excel_文本转数值型
  5. 最小链覆盖——Dilworth定理
  6. 橱柜图片-橱柜效果图-整体橱柜衣柜效果图如何选购
  7. 输入1-9显示壹贰叁..玖
  8. 普通程序员如何转向人工智能方向?
  9. 帮老婆系列-关于计算Excel表去除指定时间段后的时间差
  10. springboot配置两个parent的方法