作者 | Android_zhu_jiang

责编 | 屠敏

出品 | CSDN 博客

苹果在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:enabled是true。如果将其设置为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、运行结果如下:

版权声明:本文为CSDN博主「Android_zhu_jiang」的原创文章,仅用于技术交流,分享心得。

想为博主点赞?

想要请教博主?

扫描下方二维码,快速获取与博主直面沟通的方式吧!

热 文 推 荐 

☞雷军为什么要挖常程?

达摩院 2020 预测:量子霸权指日可待!

GitHub Action 有风险?!

☞达摩院十大科技趋势发布:2020 非同小可!

☞骗了马云 10 亿被骂 4 年后,院士王坚留下 4 条人生启示

☞阿里达摩院2020趋势第一弹:感知智能的“天花板”和认知智能的“野望”

☞你真的懂云计算吗?

☞万字长文回望2019:影响区块链行业发展的9大事件

点击阅读原文,查看博主精彩分享。

你点的每个“在看”,我都认真当成了喜欢

Android 设备上可以实现 3D Touch 吗?| 原力计划相关推荐

  1. android-b9是什么设备,Android 设备上可以实现 3D Touch 吗?| 原力计划

    这么好用的功能安卓能不模仿吗?呸!能不实现吗? 从安卓7.1(25)开始,系统新增了Shortcut来实现类似{e6803e21b9c61f9ab3d04088638cecd2}3D Touch的功能 ...

  2. 2020 年 GitHub 上那些优秀 Android 开源库,这里是 Top10! | 原力计划

    作者 | 依然饭特稀西 责编 | 郭芮 出品 | CSDN博客 每过一段时间呀,我都会给大家带来一些从Github上收集的一些开源库,有的是炫酷动效,有的则是实用的工具和类库.2020年有哪些优秀的开 ...

  3. Google、微软、阿里、腾讯、百度这些大公司在GitHub上开源投入排名分析 | CSDN原力计划...

    扫码参与CSDN"原力计划" 作者 | 村中少年 来源 | CSDN原力计划获奖作品 现在有越来越多的公司都参与了开源,其背后有各自的目的所在,姑且不予讨论.本文是从多个方面分析各 ...

  4. 史上最全排序算法总结 | 原力计划

    作者 | 铁猴 责编 | 屠敏 出品 | CSDN 博客  简介 本文对常见排序算法进行总结. 排序算法 冒泡排序 该算法比较简单,几乎所有语言涉及到算法时,都会涉及到冒泡算法. 算法思路: 比较相邻 ...

  5. android初学者_初学者:如何在Android设备上的打开的应用程序之间切换

    android初学者 When you run an app on your Android device, you can minimize it and return to the home sc ...

  6. 手机facebook注销_如何在Android设备上注销Facebook Messenger

    手机facebook注销 Ever since Facebook decided to force people to use Facebook Messenger to send and recei ...

  7. 设置android启动器,教程:在任意 Android 设备上安装 HTC 专属桌面启动器

    HTC 手机的标志性 Sense UI 几乎是伴随着 Android 系统成长起来的,BlinkFeed 作为 Sense 5 的新特性进入了人们的视野之中.经历了几代更新,BlinkFeed 受到更 ...

  8. 如何查看Android设备上的分区信息

    Android设备上,一般都会存在一块eMMC存储芯片来存放系统和用户数据,甚至部分的引导程序. 一般设备出厂时,各个厂商都会将这块存储芯片分成很多的分区,每个分区内存放不同的内容.具体分区的布局每个 ...

  9. java图像分类源码_在Android设备上使用NCNN图像分类的demo

    [实例简介] 在Android设备上使用NCNN图像分类的demo,是一个Android项目 [实例截图] [核心代码] NCNN1 └── NCNN1 ├── app │   ├── app.iml ...

最新文章

  1. 视频数据处理方法!关于开源软件FFmpeg视频抽帧的学习
  2. 可否使用串联LED(或者光敏LED)来制作光电检测板?
  3. 不管马斯克怎么说,中国智能汽车激光雷达军备竞赛已经开始
  4. 组织配置java项目的外部lib包
  5. 学成在线--16.添加课程计划
  6. 当Typora开始收费,开源免费的MarkText编辑器火了:一周新增2k+star
  7. 我理解的 Java 泛型
  8. UVA 188 Perfect Hash
  9. Flutter文本标签TextTagWidget,搜索记录流式布局显示文本标签
  10. springboot初始化逻辑_详解Spring Boot中初始化资源的几种方式
  11. Cocos2d-X-3.0之后的版本的环境搭建
  12. 深度学习花书-4.4 约束优化
  13. ScheduledThreadPoolExecutor部分源码学习
  14. Echarts实现成都市地图下钻
  15. 朱淑真 潸然看断梨花落
  16. python怎么变白-Python将png透明变为白色并保存为jpg图片
  17. app开发大致流程介绍(给非专业人士通俗易懂的明白):
  18. CTGU·OJ .特别的幸运数
  19. 今天,我们求知若渴、虚心若愚(附技术PPT)
  20. 计算机网络课后题——第四章 计算机局域网{89}

热门文章

  1. 体验Visual Studio 2015 Windows Forms应用程序开发与维护
  2. 一次关于使用status作为变量引发的bug及思考
  3. 关于TTThumbsViewController加载更多
  4. Linux MySQL主主复制(Replication)(MySQL数据双向同步)配置
  5. HDU.1009 FatMouse' Trade
  6. const与修饰函数形参
  7. leetcode 397 整数替换
  8. mysql启动和常用语法实战回顾
  9. 最大子序和--动态规划
  10. C语言结构体练习-互动粒子仿真