Android的-performHapticFeedback与振动器-文档和使用

时间:2019-05-20 03:28:08

标签: c# android xamarin haptic-feedback

TL; DR:

将感谢您在Android上获得的任何其他信息

abstract class Vibrator performHapticFeedback

最好避免使用Vibrator class并优先考虑performHapticFeedback来避免不得不询问用户权限,而只依赖于他们系统的偏好。


场景:

我正在与Xamarin一起尝试为Android和iOS实现触觉反馈。

现在,iOS文档中有一个short explanation,我已将其实现如下:

    void Platform.Vibrate(HapticsIntensity HapticsIntensity)
    {
      UIKit.UIImpactFeedbackGenerator ImpactFeedbackGenerator;

      switch (HapticsIntensity)
      {
        case HapticsIntensity.Light:
          ImpactFeedbackGenerator = new UIKit.UIImpactFeedbackGenerator(UIKit.UIImpactFeedbackStyle.Light);
          break;
        case HapticsIntensity.Medium:
          ImpactFeedbackGenerator = new UIKit.UIImpactFeedbackGenerator(UIKit.UIImpactFeedbackStyle.Medium);
          break;
        case HapticsIntensity.Heavy:
          ImpactFeedbackGenerator = new UIKit.UIImpactFeedbackGenerator(UIKit.UIImpactFeedbackStyle.Heavy);
          break;
        default:
          ImpactFeedbackGenerator = null;
          break;
      };

      if (ImpactFeedbackGenerator != null)
      {
        ImpactFeedbackGenerator.Prepare();
        ImpactFeedbackGenerator.ImpactOccurred();
      }
    }

Haptic Feedback的Android文档指出,方法 performHapticFeedback HapticFeedbackConstant 作为参数。

public boolean performHapticFeedback (int feedbackConstant)

可用的 feedbackConstant here,但它们之间似乎没有什么区别。

通话:

LongPress

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.LongPress);

具有与以下相同的效果 VirtualKey

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.VirtualKey);

键盘点击

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.KeyboardTap);

此外,某些 FeedbackConstants 甚至不会产生触觉反馈。

有谁知道我可以在这方面找到更多文档吗?


我问的原因是我正在Invention上在Xamarin上实现一个抽象层,我的目的是让我的方法调用像这样:

Vibrate(HapticsIntensity.Light);
Vibrate(HapticsIntensity.Medium);
Vibrate(HapticsIntensity.Heavy);

今天可以使用,但是在iOS上我得到轻,中和重振动的触觉反馈,在Android上,我无法区分它们。

现在,我知道Android具有Vibrate类(请参见here),该类允许进行精细控制;但是,要使用此功能,我需要添加到清单中或为我的应用(android.permission.VIBRATE)要求特定的权限,这不是最佳选择。


此外,如果我在清单中添加了android.permission.VIBRATE权限,则好像(如果设备的设置中启用了触觉反馈),我什至不需要添加Vibrate()方法调用我的按钮`onClick;并且他们已经提供了触觉反馈( BZZZTT !! 1!)。

1 个答案:

答案 0 :(得分:1)

这完全取决于设备OEM是否更改了com.android.internal.R.array资源中的ASOP代码和振动定时阵列,以启用他们在设备上使用的特殊触觉反馈“引擎”。

默认情况下,硬件OEM仅需要(在硬件中)支持标准的开/关振动(线性执行器,加权旋转等),而不是通常基于波形的“真实”触觉反馈。

与更新的iOS设备(7 | 8+?)相比,他们使用“ Taptic Engine”(花哨的意思是“先进的线性致动器”)来获得触觉反馈,而直到最近,Android设备才“迎头赶上” 在硬件方面(新的OnePlus,Pixel 3s等)开始包括更高级的触觉/振动硬件(您是否决定OEM是否对该新硬件没有做任何特别的事情……)

因此,如果您查看ASOP的PhoneWindowManager.java,您会发现大多数HapticFeedbackConstants都集中在少数几个VibrationEffects常量中,例如:

~~~
VibrationEffect.EFFECT_TICK
VibrationEffect.EFFECT_CLICK
VibrationEffect.EFFECT_HEAVY_CLICK
~~~

如果要查看特定VibrationEffects的ASOP默认值HapticFeedbackConstants是什么,请查看源代码:

如果由于某种原因必须为应用程序提供基于手动的触觉,则可以使用Vibrator API并为开/关定时提供字节数组,然后为电话设备提供特殊的硬件,以提供更多的硬件功能。