长话短说:
如有任何关于 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)
可用的feedbackConstant 是here ,但他们之间似乎没有区别。
调用:
长按
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/