c# - Android 的 - performHapticFeedback 与 Vibrator - 文档和使用

标签 c# android xamarin haptic-feedback

长话短说:

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

abstract class Vibrator 对比 performHapticFeedback

最好避免使用 Vibrator 类 并优先考虑 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)

可用的feedbackConstanthere ,但他们之间似乎没有区别。

调用:

长按

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

效果相同 虚拟 key

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

或者 KeyboardTap

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

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

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


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

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

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

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


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

最佳答案

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

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

与较新的 iOS 设备(7|8+?)相比,他们正在使用“Taptic Engine”(花哨的说法是“高级线性致动器”)进行触觉反馈,直到最近 Android 设备才“迎头 catch ”在硬件方面(新的 OnePlus、Pixel 3s 等......)开始包括更先进的触觉/振动硬件(OEM 是否对新硬件做了任何特殊处理,你决定......)

因此,如果您查看 ASOP 的 PhoneWindowManager.java,您会发现大部分 HapticFeedbackConstants 都集中在一些 VibrationEffects 常量中,例如:

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

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

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

关于c# - Android 的 - performHapticFeedback 与 Vibrator - 文档和使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56213974/

相关文章:

c# - 如何初始化 IList<IList<string>>?

c# - 从 UI 更改 ObservableCollection 不更新绑定(bind)集合

android - 如何在 Viewgroup 类中正确覆盖 onLayout 方法

android - 编写 espresso 测试时如何在设置 dagger-android 2.15 后进行模拟?

c# - 从 C# 移植的托管 C++ (CLI) 代码是否会比原始 C# 运行得更快? (TCP 服务器)

c# - 选择正确的数据类型与转换

android - android API 22 的渲染问题

android - 将 Material Design 图标与 Xamarin 表单一起使用 - 我错过了什么?

android - 防止EditText自动对焦

c# - 使用Xamarin Android,如何在任务完成之前显示进度条?