我设计了一个应用程序,当我使用加速度计移动时,它可以跟踪,并根据我可能达到的各种阈值来震动手机。我面临的一个问题是,这种振动会直接破坏加速度计的数据。
This答案建议使用低通滤波器,但我认为这在这个应用程序中行不通(我需要相对快速的响应时间,振动会导致数据中出现较大的峰值)。
我目前使用的解决方案是在手机振动前将标志设置为true,调用一个postDelayed函数,该函数将在一段时间后(1秒后)将其设置为false,在onSensorChanged函数中,只要返回标志是否为true即可。
换句话说:

isPhoneVibrating = true; // Start to vibrate
phoneVibrator.vibrate(VibratePattern, -1);
mHandler.postDelayed(vibrateSensorOff, 1000); // 1 seconds wait before making false

vibrateSensorOff仅包含
isPhoneVibrating = false;

如我所说,在onSensorChanged函数中,如果标志isPhoneVibrating为真,则返回。
我不喜欢这个解决方案,因为我需要在这个应用程序的不同状态下管理这个额外的标志。还有其他不需要额外标志的解决方案吗?

最佳答案

你可以有两个单点来跟踪手机是否振动,并管理VibratorAccelerometer
Accelerometer管理器应公开用于Accelerometer的方法,如果Vibrator未运行,则应传递所有事件(这就像加速度计数据的筛选器)。如果手机在Accelerometer管理器上振动,您应该有一个内部标志,以及设置它的方法。
Vibrator管理器应公开您用于Vibrator的方法,并在手机开始振动时更新Accelerometer管理器的标志。
这些基本上是应用程序中VibratorAccelerometer实例的包装器,但是它们应该允许您使用Accelerometer而不必担心应用程序中任何地方的Vibrator标志(只有manager对象应该处理该标志)。
我知道这个解决方案确实需要一个额外的标志,但是它允许你只在两个地方(在两个单例中)管理这个标志,而且你不必在整个应用程序中跟踪它。如果您确实实现了这两个单例,请确保您没有直接使用VibratorAccelerometer(因为您必须跟踪振动标志才能这样做)。

10-01 20:59