如何在按钮视图上启用触觉反馈

54

我希望为应用程序的按钮添加触觉反馈,并通过编程控制它们以显示按钮状态(启用和禁用)。 默认的触觉反馈设置器仅适用于长按。如何使其适用于简单的按钮点击。

是否有一种方法在触摸移动等事件上具有触觉反馈?

6个回答

123

2019年12月24日更新:

启用触觉反馈需通过以下方法:

  1. 在XML中添加android:hapticFeedbackEnabled="true"
  2. 或在代码中使用view.setHapticFeedbackEnabled(true);

    (引自Ivan Chau)

然而,还要考虑启用虚拟设备中的触觉设置。这有时很烦人,因此我们有一些标志来帮助解决(将忽略这些启用设置):

view.performHapticFeedback(
    HapticFeedbackConstants.VIRTUAL_KEY, 
    HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING  // Ignore device's setting. Otherwise, you can use FLAG_IGNORE_VIEW_SETTING to ignore view's setting.
);
Mayra想了解如何运行触觉反馈,可以使用以下代码:


示例代码:

View view = findViewById(...)
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);

这行代码可以轻松地包含在您的onclick操作中。好处是您不需要在AndroidManifest中设置权限。 (在SdkVersion“7”上我不需要这个(2.1或2.3是7))

此外,请注意,在我的代码中,仅当用户已全局启用触觉反馈时,才会运行此代码。 请参见http://developer.android.com/reference/android/view/HapticFeedbackConstants.html以始终使用它。


18
在按钮的xml中添加 android:hapticFeedbackEnabled="true" 或者在代码中使用 btn.setHapticFeedbackEnabled(true); 来启用触觉反馈。 - Ivan Chau
1
@IvanChau 我尝试使用你的代码,但没有成功。这是因为我需要指定一个按钮而不是视图吗? - MrPickles

74

这里有一个答案,虽然它可能不是最佳实现方式:

import android.view.View;
import android.os.Vibrator;

public class Main extends Activity implements OnClickListener
{
    private View myView;
    private Vibrator myVib;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        myVib = (Vibrator) this.getSystemService(VIBRATOR_SERVICE);

        //myView can be any type of view, button, etc.
        myView = (View) this.findViewById(R.id.myView);
        myView.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v)
    {
        myVib.vibrate(50);
        //add whatever you want after this
    }
}

别忘了,你还需要在程序清单(manifest)中添加“android.permission.VIBRATE”权限。你可以通过将以下内容添加到“AndroidManifest.xml”文件来实现:

<uses-permission android:name="android.permission.VIBRATE"/>

如果您将“this.getSystemService(VIBRATOR_SERVICE);”放在按钮的onClickListener内部,则“this”指的是按钮本身,该按钮没有getSystemService方法。请改用以下方式:“getApplicationContext()。getSystemService(VIBRATOR_SERVICE);” - Eric Leschinski
你不能总是在 onClickListener 中使用 getApplicationContext()。 - sudocoder

31

View有一个performHapticFeedback函数,可以让您在需要时执行它,例如在OnClick监听器上。


1
我在 onClickListener 的 onClick 方法中添加了以下代码,但它没有起作用:btn_left.performHapticFeedback(HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);我不太确定这个标志如何工作。 - Kshitij Aggarwal
1
你是否将触觉反馈设置为启用状态?根据文档http://developer.android.com/intl/fr/reference/android/view/View.html#performHapticFeedback(int),这是播放任何触觉反馈所必需的。我不确定那个常量,你尝试使用VIRTUAL_KEY了吗? - Cheryl Simon
HapticFeedbackConstants.VIRTUAL_KEY当前不可用。我目前正在使用Android 1.5_r2版本。是的,在XML文件中已经启用了按钮的触觉反馈。但仍然没有运气。 - Kshitij Aggarwal
3
直到我添加了第二个标志HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING,才对我起作用,就像Hamid Vakilian在下面的回答中所说。 - npace
不点击也能行吗?实际上,我正在尝试在 API 调用成功或失败响应时使用触觉反馈,在 Google Pixel 设备上运行良好,但在三星设备上不起作用。 - Anshul Tyagi

18
getWindow().getDecorView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
一个您可以在活动中使用的直截了当的方法。

太棒了。真的很有帮助。 - Anshul Tyagi

3
除了之前的回答外,请确保从您的设备设置中启用“振动反馈”选项。

谢谢,我想知道这个设置有没有参考资料? - alwaysday1

1
在我的情况下,我试图在对话框片段打开时执行触觉反馈。这个问题的现有答案都不起作用。我不得不包装在postDelayed中才能使其工作。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    preformHapticFeedback()
}

private fun preformHapticFeedback() {
    val delay = 1L
    requireView().postDelayed(
        {
            requireView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
        },
        delay
    )
}

是的,这也是我的情况。使用postDelayed()方法可以解决问题,但你知道为什么会出现这种情况吗? - Simileoluwa Aluko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接