ورود

View Full Version : نحوه تشخیص چندبار تکان دادن گوشی (shake)



omid_student
یک شنبه 22 دی 1392, 17:03 عصر
سلام دوستان
یه کدی گرفتم که گوشی رو شیک یا تکون که میدی رویداد اجرا میشه
حالا این یه پارامتر هم داره که تعداد shake رو میده ولی اشتباه میده
ایا شما ایده ای دارین تا بدونیم چطوری کاربر پشت سرهم گوشی رو تکون داده
کد زیر هم برای shake هست

package anywheresoftware.b4a.student;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.FloatMath;

public class ShakeEventListener implements SensorEventListener {

/*
* The gForce that is necessary to register as shake.
* Must be greater than 1G (one earth gravity unit).
* You can install "G-Force", by Blake La Pierre
* from the Google Play Store and run it to see how
* many G's it takes to register a shake
*/
private static final float SHAKE_THRESHOLD_GRAVITY = 2.7F;
private static int SHAKE_SLOP_TIME_MS = 500;
private static final int SHAKE_COUNT_RESET_TIME_MS = 3000;

private OnShakeListener mListener;
private long mShakeTimestamp;
private int mShakeCount;

public void setOnShakeListener(OnShakeListener listener) {
this.mListener = listener;
}

public interface OnShakeListener {
public void onShake(int count);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// ignore
}

@Override
public void onSensorChanged(SensorEvent event) {

if (mListener != null) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];

float gX = x / SensorManager.GRAVITY_EARTH;
float gY = y / SensorManager.GRAVITY_EARTH;
float gZ = z / SensorManager.GRAVITY_EARTH;

// gForce will be close to 1 when there is no movement.
float gForce = FloatMath.sqrt(gX * gX + gY * gY + gZ * gZ);

if (gForce > SHAKE_THRESHOLD_GRAVITY) {
final long now = System.currentTimeMillis();
// ignore shake events too close to each other (500ms)
if (mShakeTimestamp + getSHAKE_SLOP_TIME_MS() > now) {
return;
}

// reset the shake count after 3 seconds of no shakes
if (mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now) {
mShakeCount = 0;
}

mShakeTimestamp = now;
mShakeCount++;

mListener.onShake(mShakeCount);
}
}
}

private long getSHAKE_SLOP_TIME_MS() {
// TODO Auto-generated method stub
return SHAKE_SLOP_TIME_MS;
}

public void setSHAKE_SLOP_TIME_MS(int sHAKE_SLOP_TIME_MS) {
SHAKE_SLOP_TIME_MS = sHAKE_SLOP_TIME_MS;
}
}

کلاس زیر هم برای دسترسی بهشه

package anywheresoftware.b4a.student;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BA.Events;
import anywheresoftware.b4a.BA.ShortName;

@ShortName("Shake")
@Events (values={"OnShake(Count AS Int)"})

public class Shake {

private SensorManager mSensorManager;
private Sensor mAccelerometer;
private ShakeEventListener mShakeDetector;
private int intervalShake;

/**
*Initialize Shake Class
*IntervalShake argument for detect shake unit millisecond
*/
public void Initialize(final BA ba,int IntervalShake)
{
intervalShake = IntervalShake;
mSensorManager.registerListener(mShakeDetector, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
}

/**
*&lt;code&gt;
*Sub Globals
*Dim shake1 As Shake
*End Sub
*
*Sub Activity_Create(FirstTime As Boolean)
*shake1.StartListenShake("StudentShake")
*End Sub
*
*Sub StudentShake_OnShake
*ToastMessageShow("shake happend",False)
*End Sub
*
*Sub Activity_Resume
*shake1.Initilize
*End Sub
*&lt;/code&gt;
*/
public void StartListenerShake(final BA ba,String EventName)
{
// ShakeDetector initialization
mSensorManager = (SensorManager) ba.context.getSystemService(Context.SENSOR_SERVICE );
mAccelerometer = mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mShakeDetector = new ShakeEventListener();
mShakeDetector.setSHAKE_SLOP_TIME_MS(intervalShake );
final String eventName1 = EventName.toLowerCase(BA.cul) + "_onshake";
mShakeDetector.setOnShakeListener(new ShakeEventListener.OnShakeListener() {

public void onShake(int count) {
ba.raiseEvent(this, eventName1,count);
}
});
}
}