Android 15新特性,猜测性返回手势

嚴華  论坛元老 | 2025-2-13 07:50:25 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

今天跟大家先容一个Android 15系统中的新特性,猜测性返回手势。
说真话,这个特性真的难称得上是新特性了,因为它最早在Android 13系统中就已经被引入了。
但是Android 13并没有默认启用它,Android 14也没有默认启用它,直到最新的Android 15,猜测性返回手势这个功能终于被默认启用了。
那么今天,我就来跟大家先容一下这个不太为人所熟知的新特性吧。
什么是猜测性返回手势?

首先要办理的第一个问题就是,什么是猜测性返回手势?
简单来说,就是在你想要触发返回操纵时,让你可以或许提前预知即将返回到哪个界面。
在Android系统中,用户是可以通过点击返回键,或使用返回手势来回到上一个界面的。但上一个界面详细是什么?我们可能并不知道,通常得等点完了返回键之后才气知道详细会返回到哪个界面。
那么猜测性返回手势是怎么优化这部分体验的呢?貌似我们也根本没怎么见过这种能提前预知即将返回到哪个界面的效果吧。
正如前面所说,这是因为Android 13和Android 14系统都没有默认启用这个功能。它被藏得很深,以至于除了专业的Android开发者,普通用户险些是不可能体验到这个功能的。
下面我们就来学习一下怎样将这个功能打开。
首先第一步,如果你的设备是Android 15系统的话,则可以跳过这一步,因为猜测性返回手势默认已经启用了。而如果你的设备是Android 13或14系统的话,需要在开发者模式当中将“预见式返回动画”这个选项打开,如下图所示。

然后第二步,确保你的手机当前使用的导航模式是手势导航,因为猜测性返回手势这个功能只在手势导航模式下才气工作,传统的3按钮导航模式是无法体验这个功能的,如下图所示。

末了,即使你完成了前面两步,也不代表就能乐成体验到猜测性返回手势功能,因为这个功能还需要每个App去举行开发适配才行。
详细怎样适配我会在接下来的内容中举行先容,不外由于这个功能已经迭代了3个Android系统版本了,所以现在已经有很多App都完成了适配,因此多尝试几个App你应该就能触发出猜测性返回手势的效果了。
下面我们来看下详细猜测性返回手势的效果是什么样子的。
首先传统的手势返回操纵是这个样子的,当你的手指在屏幕左右两侧拖动时,会触发一个系统的返回键头,松开手指时,触发返回事件,如下图所示。

可以看出,在我们松开手指之前,是无法知道即将返回到哪个界面的。
而启用了猜测性返回手势功能,返回事件的效果就酿成了这个样子。

也就是说,我们现在可以有一个预览界面,可以或许提前知道即将返回到哪个界面。
那么有的小同伴这里就产生迷惑了,为什么我需要提前知道即将返回的是哪个界面呢?
按照Google的说法,过去的这种返回模式会存在比力高的误操纵率,即返回了之后才发现这并不是我想要去的界面。而猜测性返回手势则可以大大降低这种误操纵率。
但是我个人对这种误操纵的感受并不怎么深,似乎在我使用Android手机的时候并没有怎么受到这种返回误操纵的困扰。
而我认为,猜测性返回手势最主要的一个用处就是可以提升用户体验。
可能有的朋友会觉得,只是可以或许提前知晓即将返回到哪个界面而已,怎么就能提升用户体验了?
这里我来给大家举一个例子,信赖大家就能立即明确了。
现在我们先把返回键放在一旁,我们先来想一想Home键的使用体验是什么样子的。不管是Android还是iOS,在这部分的体验上信赖大家都黑白常认识的,即手指在屏幕的底部轻轻向上滑动,就可以触发Home键,也就是回到桌面的操纵了,如下图所示。

这个效果大家肯定是再认识不外了,我敢说险些每个人天天都在使用着。
而如果某天,Android系统将回到桌面的效果改成下图这个样子,你还能继承吗?

这个我信赖连想都不用想,不可能有那个用户乐意继承这种回到桌面效果的退化。
由此也就证明了,可以或许提前预览即将返回到的界面,也是可以提升用户体验的。
为什么猜测性返回手势没有默认启用?

既然猜测性返回手势可以提升用户体验,同时按照Google的说法,还可以降低返回事件的误操纵率,那么这么好的功能,为什么却一直没有默认启用呢?
刚才已经说了,猜测性返回手势功能最早是在Android 13系统中引入的,当时广泛猜测Google会在Android 14系统中默认启用这个功能。
然而现实情况是,Google直到Android 15系统发布才正式启用了猜测性返回手势这个功能。
一个功能居然经历了3年的系统版本迭代才正式推出,以至于一开始另有很多用户和开发者非常期待这个功能,到背面都徐徐忘却这个功能了。
那么到底是什么缘故原由让猜测性返回手势这个功能这么难产呢?
这里我用一个非常简单的例子来跟大家表明一下,观察下面这张图。

请问大家,当我的手指从屏幕底部向上滑动时,我们即将前往哪个界面?
答案很明显,那自然是前往手机的桌面了。
那么再观察下面这张图。

请问大家,当我的手指从屏幕的两侧向内滑动时,我们即将前面哪个界面?
答案是,没有人能知道。因为每个App的返回逻辑是完全可以由这些App自定义的。
也正是由于这个缘故原由,导致猜测性返回手势这个功能拖了非常久才得以正式上线,因为猜测性返回手势是需要第三方App适配才气完成的功能。
让App支持猜测性返回手势

现在我们已经从概念上对猜测性返回手势有了比力全面的明白,接下来要学习的部分自然就是怎样让我们的App可以或许支持猜测性返回手势。
这个实在非常简单,只需要一行代码就可以实现了,那就是在AndroidManifest.xml文件中将enableOnBackInvokedCallback这个属性设置为true,如下图所示。
  1.     <application
  2.         ...
  3.         android:enableOnBackInvokedCallback="true">
  4.         ...
  5.     </application>
复制代码
这里我们可以尝试一下,新建一个空的项目,然后将enableOnBackInvokedCallback属性设置为true,运行程序即可。
注意记得要先将你的手机设置成手势导航模式,另外如果你是运行在Android 13或14设备上,还需要在开发者模式当中将“预见式返回动画”启用,如果是Android 15设备则可以跳过这一步。
现在观察我们刚开发的这个程序的返回功能,如下图所示。

可以看到,只需要一行代码,我们就乐成启用了猜测性返回手势的效果了。
不外这个例子之所以能这么顺利是因为它非常的简单,没有App内对返回事件举行处理的需求。我们再来观察下面这个例子。

这个例子就可以明显看出问题来了。
初始状态下我们正在浏览一个消息列表界面,当我对某个消息感兴趣的时候,点击该消息可以阅读该消息的详细内容。
而当我完成阅读想要返回时,你会发现我无法返回到上一级消息列表界面,而是直接触发了猜测性返回手势效果回到桌面了。
这种情况就代表着我们需要举行适配了。
要想对返回事件举行处理,大家应该都知道需要去重写Activity的onBackPressed()函数。但是如果你去查察一下onBackPressed()函数的最新文档,会发现它在Android 13的时候就已经被废弃了。

废弃的缘故原由实在就是因为从Android 13开始有了猜测性返回手势,所以Google推荐我们使用OnBackInvokedCallback或androidx.activity.OnBackPressedCallback这两个新的API来处理返回事件,因为这两个API可以或许自动完成猜测性返回手势的适配。
那么为什么是有两个API来处理返回事件呢?
因为,OnBackInvokedCallback是随着Android 13系统发布的API,这意味着我们只能在Android 13及以上系统使用它,那么在Android 12及以下系统就还要使用从前的onBackPressed()函数来处理返回事件。保持着两套返回事件的处理逻辑,会让我们的代码变得更加臃肿和难以维护。
于是Google在AndroidX库中又推出了OnBackPressedCallback这个API,它保持了和OnBackInvokedCallback千篇一律的用法,同时又在全部Android系统版本中都可以使用。
所以发起大家直接使用OnBackPressedCallback这个API来处理返回事件就可以了。
下面我们来学习一下OnBackPressedCallback详细怎样使用。
  1. val callback = onBackPressedDispatcher.addCallback(this) {
  2.     // 在此处理返回事件
  3. }
  4. // 控件是否拦截拦截返回事件
  5. callback.isEnabled = shouldEnableOrDisable
复制代码
它的用法主要就是两部分。
第一,在Activity中可以调用onBackPressedDispatcher.addCallback()来启用返回事件拦截。只要调用这行代码之后,系统的返回事件就会回调到我们添加的Callback中去处理。
第二,可以调用callback.isEnabled来控制Callback的启用状态,如果设置成false则表示我们添加的Callback不启用,那就还是会走系统默认的返回逻辑。
了解了这些内容之后,现在我们就可以来办理刚才猜测性返回手势的适配问题了,代码如下。
  1. class MainActivity : AppCompatActivity() {
  2.     override fun onCreate(savedInstanceState: Bundle?) {
  3.         super.onCreate(savedInstanceState)
  4.         ...
  5.         val callback = onBackPressedDispatcher.addCallback(this) {
  6.             webview.goBack()
  7.         }
  8.         webview.webViewClient = object : WebViewClient() {
  9.             override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) {
  10.                 callback.isEnabled = webview.canGoBack()
  11.             }
  12.         }
  13.     }
  14. }
复制代码
我们通过重写WebViewClient的doUpdateVisitedHistory()函数来监听WebView的前进和后退事件。
当发现WebView无法再后退的时候,说明它已经回到最初始的消息列表界面了。此时将Callback设置为禁用,这样返回事件就会交还给系统去处理。
现在重新运行一下程序,效果就正常了。

Android 14&15的猜测性返回手势

猜测性返回手势最早在Android 13中被引入的时候,功能还比力单一,只有最根本的提前预览返回桌面的效果。
后来Google在Android 14中为猜测性返回手势参加了更加丰富的功能,这些功能在Android 14及以上的系统都是支持的,下面我们就来学习一下。
首先,Android 13的猜测性返回手势只支持即将返回桌面时的预览效果,我们的App内部如果有多个Activity,它们之间的返回是不会有预览效果的,如下图所示。

而Android 14在这方面则做了进一步的扩展,即使是App内部的Activity之间的返回,也会有返回预览的效果。这个功能在Android 14及以上系统中是自动开启的,效果如下图所示。

当然,或许这并不是你想要的效果。大概你就是想要Android 13系统那样,只在即将返回桌面时才支持返回预览效果。
不用担心,Android对此也是支持的。因为从Android 14开始,我们可以精确到Activity级别来控制是否启用猜测性返回手势,示例代码如下。
  1. <manifest ...>
  2.     <application ...
  3.         android:enableOnBackInvokedCallback="true">
  4.         <activity
  5.             android:name=".MainActivity"
  6.             ...>
  7.         </activity>
  8.         <activity
  9.             android:name=".SecondActivity"
  10.             android:enableOnBackInvokedCallback="false"
  11.             ...>
  12.         </activity>
  13.     </application>
  14. </manifest>
复制代码
可以看到,这里在标签上将enableOnBackInvokedCallback设置为true,表示在全局范围启用了猜测性返回手势。但是我们仍然可以针对详细某一个Activity,比如说这里的SecondActivity,将它的enableOnBackInvokedCallback设置成false,这样就可以在SecondActivity触发返回操纵时,禁用提前返回预览的功能。
除此之外,Android 14还答应我们对Activity之间的返回预览动画效果举行自定义。
自定义Activity之间的跳转动画信赖大家都有用过,就是调用Activity的overridePendingTransition()函数,然后传入enter和exit动画即可。
但是如果你查察一下最新的Android文档,你会发现这个函数在Android 14中也被废弃了。

废弃的缘故原由不用多说,自然也是因为猜测性返回手势。
现在Android 14及以上系统推荐使用overrideActivityTransition()函数来自定义Activity之间的跳转动画,因为这个函数可以自动适配猜测性返回手势功能。
下面我来定义一个Activity横向滑入滑出的动画效果,分别对应4个动画文件。
  1. slide_in_left.xml
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4.     android:duration="1000"
  5.     android:fromXDelta="-100%p"
  6.     android:toXDelta="0" />
  7. </set>
  8. slide_in_right.xml
  9. <set xmlns:android="http://schemas.android.com/apk/res/android">
  10. <translate
  11.     android:duration="1000"
  12.     android:fromXDelta="100%p"
  13.     android:toXDelta="0" />
  14. </set>
  15. slide_out_left.xml
  16. <set xmlns:android="http://schemas.android.com/apk/res/android">
  17. <translate
  18.     android:duration="1000"
  19.     android:fromXDelta="0"
  20.     android:toXDelta="-100%p" />
  21. </set>
  22. slide_out_right.xml
  23. <set xmlns:android="http://schemas.android.com/apk/res/android">
  24. <translate
  25.     android:duration="1000"
  26.     android:fromXDelta="0"
  27.     android:toXDelta="100%p" />
  28. </set>
复制代码
接下来在MainActivity和SecondActivity中分别参加如下代码。
  1. class MainActivity : AppCompatActivity() {
  2.     override fun onCreate(savedInstanceState: Bundle?) {
  3.         super.onCreate(savedInstanceState)
  4.         ...
  5.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
  6.             overrideActivityTransition(OVERRIDE_TRANSITION_OPEN, R.anim.slide_in_right, R.anim.slide_out_left)
  7.         }
  8.     }
  9. }
  10. class SecondActivity : AppCompatActivity() {
  11.     override fun onCreate(savedInstanceState: Bundle?) {
  12.         super.onCreate(savedInstanceState)
  13.         ...
  14.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
  15.             overrideActivityTransition(OVERRIDE_TRANSITION_CLOSE, R.anim.slide_in_left, R.anim.slide_out_right)
  16.         }
  17.     }
  18. }
复制代码
然后重新运行程序,效果如下图所示。

由于增长了Activity之间的跳转动画,你会发现从MainActivity跳转到SecondActivity现在就有了横向滑动动画的效果。
但更加令人惊喜的是,你会发现当我们举行返回操纵时,系统会根据我们刚才自定义的动画效果,自动适配到猜测性返回手势上面。
有了这套机制,实在讲道理我们就可以实现任意范例的猜测性返回手势动画效果了,比如这个是Android官网上给出的一个非常炫酷的返回动画效果图。

当然这个是在同一个Activity中触发返回事件的动画效果,和我们上面举的例子又不太一样。不外放心,在Android 14及以上系统,这些功能都是被支持的。
想要学习上图效果详细怎样实现,以及猜测性返回手势所支持的更多动画范例,都可以去参考Android官网的文档,链接如下:
https://developer.android.com/guide/navigation/custom-back/support-animations
我们本篇文章的篇幅毕竟有限,上面链接里的内容这里就不再睁开了。
那么我们下篇原创文章再见。

如果想要学习Kotlin和最新的Android知识,可以参考我写的书 《第一行代码 第3版》,点击此处查察详情。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表