对 Android 中的触觉反馈感到困惑
Posted
技术标签:
【中文标题】对 Android 中的触觉反馈感到困惑【英文标题】:Confused about haptic feedback in Android 【发布时间】:2014-11-03 02:06:21 【问题描述】:我有一个带有 9 个按钮的 android 应用。此应用程序在 2.36 上运行,并且是设备上唯一的应用程序(或者至少是我们让用户使用的唯一应用程序 - 我们在交付设备时预装了我们的代码,作为我们销售的工业产品套件的一部分。)
所有按钮都转到同一个处理程序并通过它们的标签进行分类。处理程序在 XML 中指定:
<Button android:id="@+id/IdleButton"
android:layout_marginLeft="5dp"
android:background="@drawable/idle18pt_he_normal"
android:hapticFeedbackEnabled="true"
android:layout_
android:layout_
android:tag="0"
android:onClick="theButtonHandler">
</Button>
我想在用户按下按钮时启用触觉反馈,即振动。有没有办法在 XML 中做到这一点,或者如果没有,有没有办法在我的 onClick() 处理程序中做到这一点?
我在 Android 上看到的关于触觉反馈的网络示例(例如,http://androidcookbook.com/Recipe.seam?recipeId=1242)似乎主要涉及对清单的更改、对 XML 的更改(您可以看到我已经在我的 XML 中启用了它,上面) 然后为按钮声明、初始化和实现一个单独的 Touch 处理程序。这似乎需要做很多工作,尤其是因为我有 9 个按钮。
由于我的所有按钮都只有一个 onClick 处理程序,有没有一种方法可以在那里实现触觉反馈?
当我点击我的一个按钮时,我所要做的就是在手机设置的“声音”部分中勾选“可听选择”——根本不需要编码。为什么触觉反馈要复杂得多?
【问题讨论】:
【参考方案1】:未使用VIBRATE
权限。
您可以使用任何View
的performHapticFeedback()
函数,包括Button
。
例如在 Kotlin 中以编程方式:
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
这会使设备振动。
您可以在Fragment
或Activity
中的任何位置振动设备,即使您没有可用的View
。
在 Fragment 中你可以这样做:
requireView().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
在活动中你做的:
window.decorView.rootView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
【讨论】:
能否提供您的设备名称和操作系统版本?因为此解决方案不适用于我的任何设备。 @LibinThomas,我已经成功地从 Lollipop 开始测试。我相信这也适用于旧版本,因为对performHapticFeedback()
的支持可以追溯到 Android API 3。
检查了 OnePlus 设备,它们都没有工作。如果遗漏了什么,你能指导我吗?甚至我也添加了振动器权限-谢谢
@LibinThomas,此功能不需要振动器权限。如果您没有设备,请使用模拟器检查您的代码是否适用于旧版本的 Android。除了Fragment
,您还可以尝试更具体的View
。最后,如果此解决方案对您不起作用,您始终可以使用振动的权限方式。你可以在这个question找到代码。
@LibinThomas,对于第一个解决方案,请尝试添加标志,所以不要使用上面的代码,而是像这样使用它:requireView().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING)
【参考方案2】:
创建一个继承自Button
的自定义VibrateButton
类,并添加此振动onClick
。您仍然需要在 Manifest 中请求权限,因此如果没有继承,您将无能为力。此示例代码取自from here,并做振动。
import android.os.Vibrator;
...
Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
v.vibrate(500);
注意:
不要忘记在 AndroidManifest.xml 文件中包含权限:
<uses-permission android:name="android.permission.VIBRATE"/>
按钮可以自动设置声音,但不能自动设置振动的原因,与它要求允许振动的权限相同。振动会消耗电池(不仅仅是简单的声音),因此它会影响电池持续时间,这需要以某种方式得到最终用户的批准。如果您看到,在大多数情况下,某些特定按钮(主要是键盘应用程序)有一个“点击时振动”选项,但这取决于每个应用程序。
PS:确保设备可以振动。在为 Nexus 7 2012 添加振动时,我愚蠢地浪费了几个小时;它没有振动模块。此外,请确保您可以禁用它,以延长电池续航时间。
【讨论】:
以上是关于对 Android 中的触觉反馈感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms iOS 依赖服务中的触觉反馈崩溃
Android M 权限:对 shouldShowRequestPermissionRationale() 函数的用法感到困惑