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!)。
答案 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并为开/关定时提供字节数组,然后为电话设备提供特殊的硬件,以提供更多的硬件功能。