我有一个主页,它链接到4个不同的活动(页面)。我已经使用SensorEventListener
实现了摇动功能,并且它可以正确响应,但是例如,目前我只能用它来打开一个活动:我可以摇动一次来打开一个活动,或者摇动两次来打开一个活动活动,但不是一次同时包含这两个if
语句。
我尝试使用带边界的if和else语句,因为我知道如何设置摇动次数,但是我不明白如何让程序检测到它完全等待我做多少次摇动任务。
private final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
Intent tts = new Intent(context, ttsScreen.class);
Intent stt = new Intent(context, sttScreen.class);
Intent cbb = new Intent(context, cbbScreen.class);
Intent ocr = new Intent(context, ocrScreen.class);
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
acelLast = acelValue;
acelValue = (float) Math.sqrt((double) (x*x + y*y + z*z));
float difference = acelValue - acelLast;
shake = shake * 0.9f + difference;
if(shake > 12 && shake < 24 ) {
startActivity(tts);
}
else if (shake > 24 && shake < 36) {
startActivity(stt);
}
else if (shake > 36 && shake < 48) {
startActivity(cbb);
}
else if (shake > 48) {
startActivity(ocr);
}
}
在我的onCreate
方法中,我有以下内容:
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sm.registerListener(sensorListener,sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
acelValue = SensorManager.GRAVITY_EARTH;
acelLast = SensorManager.GRAVITY_EARTH;
shake = 0.00f;
此刻,它将始终打开startActivity(tts)
。我不确定我应该采取哪种方法,但是我在想也许是计时器或其他工具,以便它可以在开始一项活动之前全面检查我进行了几次摇晃。还是if / else方法不是正确的方法?
答案 0 :(得分:2)
免责声明:我不是android开发人员,对此没有经验。我尚未测试解决方案
在用户停止摇动手机之前,请勿拨打startActivity()
。您可以通过查看加速度的最后几个差异来找出答案。如果该值足够低,不再算作抖动,那么最终您可以使用正确的Intent调用startActivity。
private final SensorEventListener sensorListener = new SensorEventListener() {
private float differenceMedian = 0f;
@Override
public void onSensorChanged(SensorEvent event) {
Intent tts = new Intent(context, ttsScreen.class);
Intent stt = new Intent(context, sttScreen.class);
Intent cbb = new Intent(context, cbbScreen.class);
Intent ocr = new Intent(context, ocrScreen.class);
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
acelLast = acelValue;
acelValue = (float) Math.sqrt((double) (x*x + y*y + z*z));
float difference = acelValue - acelLast;
shake = shake * 0.9f + difference; // will increase shake as long as user continues to shake (I think?)
// differenceMedian will relatively slowly drop towards 0 when difference stays low
differenceMedian = (difference + differenceMedian ) /2;
if(differenceMedian < 1){ // depends. try to adjust the 1 here
if(shake > 12 && shake <= 24 ) { // please notice <= because what if shake is exactly 24? same for following else-ifs.
startActivity(tts);
}
else if (shake > 24 && shake <= 36) {
startActivity(stt);
}
else if (shake > 36 && shake <= 48) {
startActivity(cbb);
}
else if (shake > 48) {
startActivity(ocr);
}
}
}
编辑:正如Gabe指出的那样,在多次调用onSensorChanged()时,差异必须非常小,以确保用户确实停止了摇晃手机