4

TL;博士:

非常感谢有关 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();
      }
    }

Haptic Feedback的 Android 文档指出方法performHapticFeedback需要一个HapticFeedbackConstant作为参数。

public boolean performHapticFeedback (int feedbackConstant)

可用的feedbackConstant这里,但它们之间似乎没有区别。

来电:

长按

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甚至不会产生触觉反馈。

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


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

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

这在今天有效,但在 iOS 上,我在哪里获得轻、中和重振动的触觉反馈,在 Android 上,我无法区分它们。

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


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

4

1 回答 1

3

这完全取决于设备 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
~~~

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

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

于 2019-05-20T04:31:39.390 回答