Android 的 - PerformHapticFeedback 与 Vibrator - 文档和使用

Gus*_*Gus 5 c# android xamarin haptic-feedback

长话短说:

如果有关于 Android 的任何额外信息,我们将不胜感激

抽象类 Vibrator PerformHapticFeedback

最好避免使用Vibrator class并优先performHapticFeedback避免必须询问用户的权限,并且仅依赖于他们的系统的偏好。


设想:

我正在与 Xamarin 合作,尝试为 Android 和 iOS 实现触觉反馈。

现在,iOS 文档有一个简短的解释,我已将其实现如下:

    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();
      }
    }
Run Code Online (Sandbox Code Playgroud)

Android触觉反馈文档指出, performHapticFeedback方法需要HapticFeedbackConstant作为参数。

public boolean performHapticFeedback (int feedbackConstant)
Run Code Online (Sandbox Code Playgroud)

可用的反馈常量这里,但它们之间似乎没有区别。

呼叫:

长按

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.LongPress);
Run Code Online (Sandbox Code Playgroud)

与VirtualKey效果相同

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.VirtualKey);
Run Code Online (Sandbox Code Playgroud)

键盘点击

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.KeyboardTap);
Run Code Online (Sandbox Code Playgroud)

此外,一些反馈常数甚至不会产生触觉反馈。

有谁知道我在哪里可以找到有关此问题的更多文档?


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

Vibrate(HapticsIntensity.Light);
Run Code Online (Sandbox Code Playgroud)
Vibrate(HapticsIntensity.Medium);
Run Code Online (Sandbox Code Playgroud)
Vibrate(HapticsIntensity.Heavy);
Run Code Online (Sandbox Code Playgroud)

这在今天是可行的,但在 iOS 上我得到了轻、中、重振动的触觉反馈,在 Android 上我无法区分它们。

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


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

Sus*_*ver 4

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

默认情况下,硬件 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
~~~
Run Code Online (Sandbox Code Playgroud)

VibrationEffects如果您想了解特定的ASOP 默认值,请查看源代码HapticFeedbackConstants

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