我有一个带有 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_width="92dp"
android:layout_height="92dp"
android:tag="0"
android:onClick="theButtonHandler">
</Button>
我想在用户按下按钮时启用触觉反馈,即振动。 有没有办法仅在 XML 中执行此操作,或者如果没有,是否有方法在我的 onClick() 处理程序中执行此操作?
我见过的 Android 上触觉反馈的 Web 示例(例如,http://androidcookbook.com/Recipe.seam?recipeId=1242)似乎大多涉及对清单的更改、对 XML 的更改(您可以请参阅上面我已经在 XML 中启用了它),然后为按钮声明、初始化和实现一个单独的触摸处理程序。 这看起来工作量很大,尤其是因为我有 9 个按钮。
由于我的所有按钮都只有一个 onClick 处理程序,有没有一种方法可以在那里实现触觉反馈?
当我点击其中一个按钮时,我所要做的就是在手机设置的“声音”部分中选中“声音选择”,以获得“咔嗒”声 - 根本不需要编码。 为什么触觉反馈如此复杂?
VIBRATE
权限。您可以使用任何
performHapticFeedback()
的 View
功能,包括 Button
。
例如在 Kotlin 中以编程方式:
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
这会使设备振动。
即使您没有可用的
Fragment
,您也可以从 Activity
或 View
中的任何位置振动设备。
在 Fragment 中你可以这样做:
requireView().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
在“活动”中,您执行以下操作:
window.decorView.rootView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
创建一个继承自
VibrateButton
的自定义 Button
类,并添加此振动 onClick
。您仍然需要在清单中请求权限,因此如果不继承,您将无能为力。此示例代码取自此处,并执行振动。
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 添加振动时,我愚蠢地浪费了几个小时;它没有振动模块。另外,请确保您可以禁用它,以使电池保持更长时间。
在某些设备上,例如三星 v.vibrate(500) 或模式振动不起作用 所以我尝试了以下解决方案并且成功了。
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING)