首页 欧洲联赛正文

那年青春我们正好,Android10 手势导航开发与处理:处理手势抵触(III),缤智

这是咱们有关“手势导航”系列的第三篇文章。假如您郭起月教师想跳到另一篇文章,可以在下面找到它们:

A被女上司镇压ndroid10 手势导航开发与处理:边到边(I)

Android10 手势导航开发与处理:处理视觉堆叠(II)

上一篇文章标志着咱们议论画边际的结束。在第三后咱们将评论怎么处理任何手势冲突,您的运用程序和新的之间体系的手势在Android的10。

手势冲突是什么意思?让咱们看一个比如。在这儿,咱们有一个音乐播放器运用程序,该运用程序答运用户经过拖动拖动当时歌曲SeekBar。

不幸的SeekBar是,太挨近原始手势区域,导致体系快速切换手势接收用户并运用户感到困惑。

具有手势区域的任何屏幕边际都或许发作相同的状况。有许多或许导致冲5xzz2突的常见示例,例如:导航抽屉(DrawerLayout),轮播(ViewPager),滑块(SeekBar),列表上的滑动操作。

这就带来了“怎么处理这个问题”的问题。为了处理这个问题,咱们创立了流程图以协助辅导其间一种处理方案。

期望这些问题不言自明,可是假如您不确定其间的任何一个,让咱们对每个问题进行解说:

1.躲藏导航栏和状态栏所需的运用程序吗?

第一个问题是问询您运用的首要用例是否需求躲藏导航和/或状态栏。所谓“躲藏”,是指它们底子不行见。它并不意味着你现已取得了你的运用程序去边到边,或相似的。

对这个问题答复“是”的或许原因是:

  • 您运用FLAG_FULLSCREENWindowManager标志。留意,这也可以经过android:windowFullscreen主题特点来完结,或许从Theme.XXX.Fullscreen主题变体之一扩展。
  • 您运用SYSTEM_UI_FLAG_FULLSCREENsystem-ui可见性标志。
  • 您可以运用沉溺式形式system-ui可见性标志之一:SYSTEM_UI_FLAG_IMMERSIVE或SYSTEM_UI_FLAG_IMMERSIVE_STICKY禛心真意长相守。

可以答复“是”的运用程序的一些常见示例是游戏,视频播放器,相片检查器,绘图运用程序。

2.首要的UI用例需求在手势现代修神传区域内/邻近滑动?

这个问题是在问询用户界面是否包括手势区域中/邻近的任何元素(向后和向后),要求用户在其上滑动。

因为以下原因,游戏一般会在此处答复是:

  • 屏幕上的控件往往挨近左/右边际,而且挨近屏幕底部。
  • 某些游戏需求在屏幕上可那年芳华咱们正好,Android10 手势导航开发与处理:处理手势冲突(III),缤智以滑动的屏幕元素上滑动,例如棋盘游戏运用程序。

在游戏之外,常见的UI示例将在此处答复“是”:

  • 图片裁剪用户界康熙朝袍面,其间拖动手柄坐落屏幕左/右边际邻近。
  • 绘图运用程序,用户可以在掩盖屏幕的画布上绘图。

3.手势区域中/邻近的常用视图?

一个期望简略的问题。这也包括掩盖手势区域的视图,然后扩展到屏幕的更多区域,例如a DrawerLayout或large ViewPager。

4.视图需求用户滑动/拖动吗?

咱们在这儿稍作改动,然后开端检查各个视图。关于您对#2答复勒东博士县长在线播放“是”的任何视图,是否都需求用户在其上滑动/拖动?

在许多示例中,您会在此处答复“是”:SeekBars,底部作业表乃至是PopupMenu(可以拖动以翻开)。

5.视图是否彻底/大部分坐落手势区域下?

从问题4开端,咱们现在要问询视图是彻底显现仍是大部分放置在手势露点相片区域下。

假如您的视图坐落比如的可翻滚容器中,则RecyclerView对这个问题的考虑会稍有不同:该视图是否彻底/大部分安置在一切翻滚方位的手势区域下?假如用户可以将视图翻滚到手势区域之外,则无需履行任何操作。

您或许现已看过上面的图表,并看到了全尺度轮播(ViewPager)的示例在此处答复“否”,而且想知那年芳华咱们正好,Android10 手势导航开发与处理:处理手势冲突(III),缤智道为什么它导致不进行任何处理。这是因为20dp与视图的宽度比较,左/右手势区域的宽度相对较小(默神谈二五认值:每个)。纵向的典型电话屏幕宽度约为360dp,可见屏幕的宽度约为320dp,用户的滑动不受阻止(挨近 90%)。即便具有内部填充/边距,用户仍将可以像平常相同滑动轮播。

6.视图规模是否与任何强制性手势区域堆叠?

终究一个那年芳华咱们正好,Android10 手势导航开发与处理:处理手势冲突(III),缤智问题问询是否将视图放置在任何强制手势区域下。假如回想一下咱们曾经的博客文章,您会记住,强制体系手势区域是屏幕上一直优先显现体系手势的区域。

Android 10在屏幕底部只要一个强制手势区域,答运用户回家或调出最近运用的运用程序。这或许会在将来的渠道版别中发作变化,可是现在咱们只需求考虑屏幕底部的视图即可。

常见的比如是:

  • 非模态底板,因为它们倾向于在屏幕底部折叠为较小的可拖动视图。
  • 屏幕底部的水平翻滚轮播,例如贴纸包UI。

已然咱们现已处理了一切亡魂梦问题,期望您现已找到了其间一种处理方案,因而让咱们更具体地研讨每种处理方案。

没有冲突要处理

让咱们从最简略的“处理方案”开端,简略地做…… 什么都不做!

或许还有优化二婶的B好爽你可以做(见下节),但运用启用手势导航形式的运用程序时,期望没有重大问题。

假如图表将您引到此处,但您依然觉得有问题,请告知咱们。咱们或许错过了一些东西。


将视图移出手势区域

正如咱们在上一篇博客文章中了解到的那样,调度了一些实例来告知您的运用程序体系手势区域在屏幕上的方位。咱们可以用来处理手那年芳华咱们正好,Android10 手势导航开发与处理:处理手势冲突(III),缤智势冲突的一种办法是将一切冲突的视图移出手势区域。这关于屏幕底部邻近的视图特别重要,因为该区域是强制性手势区域,而且运用程序无法在该区域运用扫除API。

让咱们看一个比如。这儿有上面显现的音乐播放器用户界面。它包括一个SeekBar坐落屏幕底部,答运用户擦拭的歌曲。

屏幕底部带有SeekBar的音乐播放器用户界面

可是,当用户测验擦拭歌曲时,会发作这种状况:

记载与SeekBar冲突的体系手势

发作这种状况是因为底部手势区域与SeekBar堆叠,因而原始手势优先。这是视觉上的手势区域:

简略的处理方案

这儿最简略的处理方案是增加其他边距/填充,以便将SeekBar向上推到手势区域之外。像这样:

如昌乐远古火山口果运用此示例拖动SeekBar,您将看到咱们不再触发原始手势:

演示显现SeekBar不再与底部体系手势冲突

为了完结这一点,咱们需求运用API 29和Jetpack Core库 v1.2.0(当时为alpha)中供给的新体系手势inset。在示例中,咱们增加的底部填充以匹配底部手势刺进值:SeekBar

ViewCompat.setOnApplyWindowInsetsListener(seekBar) { view, insets ->
view.updatePadding(
bottom = insets.systemGestureInsets.bottom
)
insets
}

更进一步

您此刻或许会想到:“作业已完结”,关于某些布局,这很或许是终究处理方案。可是在咱们的示例中,UI现在在外观上现已畏缩,而且下方有许多糟蹋的空间SeekBsunnylanear。因而,除了简略地填充视图之外,咱们还可以从头布局,以防止糟蹋空间:

演示,显现SeekBar移至回放栏的顶部

在这儿,咱们将移到了SeekBar回放栏的顶部,彻底移出了手势区域。这意味着咱们不再需求填充/增加杆的高度来包容SeekBar。

可是,咱们应该按体系栏的高度来填充/增加栏的高度,以使文本不会显着被隐瞒。咱们的第二篇博客文章“ 处理视觉堆叠 ” 对此进行了介绍。


运用手势扫除API

在咱们之前的博客文章中,咱们说到“ 运用程序可以扫除屏幕某些部分的体系手势 ”。运用程序经过Android 10中新增的体系手势扫除API来完结此意图。

体系供给了两种不同的功能来扫除区域:View.setSystemGestureExclusionRects()和Windo艾莉莉w.setSystemGestureExclusionRects()。孕夫种田记您运用哪种运用取决于您的运用:假如您运用的是Android View,则体系首选View API,不然请运用该WindowAPI。

这两个API之间的首要差异在于Window API期望任何矩亦遇如爱易形都坐落窗口坐标空间中。假如运用的是视图,则一般将改为在视图的坐标空间中进行操作。在检查API需求坐标空间之间转化的照料,这意味着你只需求考虑的阅读内容条款。

让咱们看一个比如。咱们将再次运用咱们的音乐播放器示例,该示例SeekBar布局在整个屏幕宽度上。咱们Seek那年芳华咱们正好,Android10 手势导航开发与处理:处理手势冲突(III),缤智Bar在上一节中修正了触发原始手势的问题,可是依然需求考虑左右手势区域。

让咱们看一下当用户在SeekBar“ thumb”(圆形拖动器)坐落边际之一邻近的状况下测验擦拭歌曲时会发作什么状况:

该演示显现SeekBar与后手势区域冲突

因为拇指在右手势区域下,因而体系以为用户正在手势以向后走,因而显现了向后箭头。这对用户来说是个困惑,因为他们或许并不意味着真实回去。咱们可以运用上述手势扫除API来处理此问题,以扫除“拇指”的边界。

手势扫除API一般在两个当地调用:onLayout()布局onDraw()视图时和制作视图时。您的视图传入List,其间包括应扫除的一切矩形。如前所述,这些矩形有必要坐落视图自己的坐标系中。

一般,您会创立一个与此相似的函数,该函数可从onLayout()和/或中调用onDraw():

private val gestureExclusionRects = mutableListOf()
private fun updateGestureExclusion() {
// Skip this call if we're not running on Android 10+
if (Build回乳汤.VERSION.SDK_INT < 29) return
// First, lets clear out any existing rectangles
gestureExclusionRect驴配种s.clear()
// Now lets work out which areas should be excluded. For a SeekBar this will
// be the bounds of the thumb drawable.
thumb?.also { t ->
gestureExclusionRects += t.copyBounds()
}
// If we had other elements in th中华精英联盟主论坛is view near the edges, we could exclude them
// here too, by adding their bounds to the list
// Finally pass our updated list of r那年芳华咱们正好,Android10 手势导航开发与处理:处理手势冲突(III),缤智ectangles to the system
systemGestureExclusionRects = gestureExclusionRects
}

增加完后,在边际邻近进行擦拭将按预期进行:

该演示显现了SeekBar与后手势区域一同运用

请留意上述示例。SeekBar实际上会在Android 10中主动为您履行此操作,因而您无需自己履行此操作。仅仅作为示例向您展现惯例形式。

约束条件

虽然手势扫除API好像是处理一切手势冲突的完美处理方案,但实际上并非如此。经过运用手势扫除API,您可以声明运用手势比回退的体系操作更重要。这是一个强有力的声明,这便是为什么当您力不从心时,将此A那年芳华咱们正好,Android10 手势导航开发与处理:处理手势冲突(III),缤智PI视为逃生舱门的原因。

经过运用手势扫除API,您声明晰运用手势比回退的体系操作更重要

因为API启用的行为会对用户形成损坏,因而体系约束了其运用方法:运用程序每个边际最多只能扫除200dp

开发人员听到这些常见问题时会提出以下问题:

为什么有约束?期望上面的解说给您一个提示。咱们以为,用户可以继续从边际滑动回来是十分重要的。在整个设备上保持一致,而不仅仅是一个运用程序。这个约束好像很严厉,可是只需求一个运用程序就可以扫除屏幕的整个边际,然后运用户感到困惑,然后导致运用程序卸载或愈加剧烈。

换句话说,体系导航有必要一直保持一致和可用。

为什么是200dp?200dp背面的主意十分简略。正如咱们前面说到的,手势扫除API的意思是逃生舱口,因而该约束被核算为重要接触方针的倍数。在最小引荐巨细的接触方针48dp。4个接触方针 48dp= 192dp。增加一点填充,咱们的价值为200dp

假如我要求在边际上扫除200dp以上怎么办?体系将仅实现您要求的最底200dp。

体系可满足要求的总高度200dp(从底部边际算起)

我的视图不在屏幕上,是否算作极限?不,体系仅核算屏幕规模内的扫除矩形。相同,假如视图部分显现在屏幕上,则仅核算所恳求矩形的可见部分。


沉溺在下一篇文章中

您或许现已到了这儿,而且想知道为什么咱们没有包括流程图的右侧。这些处理方案专门用于需求在整个屏幕上制作的运用程序。咱们将在下一篇博客文章中供给这些内容。

请重视 !更好的文章等你来发现!

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。