2012-03-29 7 views
4

Ich habe Probleme herauszufinden, wie Sie den Code aus dieser Antwort implementieren. Android: I want to shake itEin Shake-Ereignis implementieren

Muss ich eine Methode erstellen und eine if-Anweisung verwenden, um festzustellen, ob mAccel größer als 0 ist?

package your.shake.namespace; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.hardware.Sensor; 
    import android.hardware.SensorEvent; 
    import android.hardware.SensorEventListener; 
    import android.hardware.SensorManager; 
    import android.os.Bundle; 
    import android.os.Vibrator; 
    import android.widget.TextView; 

public class ShakeListener extends Activity { 

TextView display; 
Vibrator v; 

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
     mAccel = 0.00f; 
     mAccelCurrent = SensorManager.GRAVITY_EARTH; 
     mAccelLast = SensorManager.GRAVITY_EARTH; 
     display = (TextView) findViewById(R.id.tvText); 
     v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
} 

private SensorManager mSensorManager; 
    private float mAccel; // acceleration apart from gravity 
    private float mAccelCurrent; // current acceleration including gravity 
    private float mAccelLast; // last acceleration including gravity 

    private final SensorEventListener mSensorListener = new SensorEventListener() { 

    public void onSensorChanged(SensorEvent se) { 
     float x = se.values[0]; 
     float y = se.values[1]; 
     float z = se.values[2]; 
     mAccelLast = mAccelCurrent; 
     mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z)); 
     float delta = mAccelCurrent - mAccelLast; 
     mAccel = mAccel * 0.9f + delta; // perform low-cut filter 


    } 

    public void onAccuracyChanged(Sensor sensor, int accuracy) {    
    } 
    }; 

    // My code 3_29_12 
public void shake(){ 

    if (mAccel > 2.00f){ 
     v.vibrate(100); 
    } 
    else{ 
     mAccel = 0.00f; 

     }  

} 




    @Override 
    protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    protected void onStop() { 
    mSensorManager.unregisterListener(mSensorListener); 
    super.onStop(); 
    } 
+0

verwenden kann ich nicht verstehen, Ihre Frage. Wird Ihr Listener (mSensorListener) aufgerufen? Welche Werte erhalten Sie für x, y und z? Sie sollten auch Ihren Code aufräumen. Ich kann eine Deklaration für mAccel geben, aber keine Deklaration für die in Ihrer shake() Methode. Endlich, wo rufst du shake() an? – Simon

Antwort

8

Ich denke, das macht die Dinge für Sie einfacher.

Erstellen Sie eine neue KlasseShakerund fügen Sie diese genannt.

public class Shaker { 
private SensorManager mgr = null; 
private long lastShakeTimestamp = 0; 
private double threshold = 1.0d; 
private long gap = 0; 
private Shaker.Callback cb = null; 

public Shaker(Context ctxt, double threshold, long gap, Shaker.Callback cb) { 
    this.threshold = threshold * threshold; 
    this.threshold = this.threshold * SensorManager.GRAVITY_EARTH 
      * SensorManager.GRAVITY_EARTH; 
    this.gap = gap; 
    this.cb = cb; 

    mgr = (SensorManager) ctxt.getSystemService(Context.SENSOR_SERVICE); 
    mgr.registerListener(listener, 
      mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 
} 

public void close() { 
    mgr.unregisterListener(listener); 
} 

private void isShaking() { 
    long now = SystemClock.uptimeMillis(); 
    try { 
     if (lastShakeTimestamp == 0) { 
      lastShakeTimestamp = now; 

      if (cb != null) { 
       cb.shakingStarted(); 
      } 
     } else { 
      lastShakeTimestamp = now; 
     } 
    } catch (NullPointerException e) { 

    } 
} 

private void isNotShaking() { 
    long now = SystemClock.uptimeMillis(); 

    if (lastShakeTimestamp > 0) { 
     if (now - lastShakeTimestamp > gap) { 
      lastShakeTimestamp = 0; 

      if (cb != null) { 
       cb.shakingStopped(); 
      } 
     } 
    } 
} 

public interface Callback { 
    void shakingStarted(); 

    void shakingStopped(); 
} 

private final SensorEventListener listener = new SensorEventListener() { 
    @Override 
    public void onSensorChanged(SensorEvent e) { 
     if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
      double netForce = e.values[0] * e.values[0]; 

      netForce += e.values[1] * e.values[1]; 
      netForce += e.values[2] * e.values[2]; 

      if (threshold < netForce) { 
       isShaking(); 
      } else { 
       isNotShaking(); 
      } 
     } 
    } 

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

In Ihrem Activity implementieren Shaker.Callback und nutzen die Methoden shakingStarted() und shakingStopped() zu tun, tatsächlich etwas.

+0

Ich kann das nicht funktionieren. Ich habe es in meiner Hauptaktivität implementiert und beide Methoden verwendet, aber es wird meine Shakes weder auf Galaxy S2 noch auf S4 registrieren – Jonno

+0

Rufen Sie dies im onCreate Ihrer Aktivität auf: Shaker Shaker = neuer Shaker (getBaseContext(), 1.0d, 0, Dies); –

+0

Wie übergebe ich den letzten Parameter im Konstruktor Callback ..? –

0

Hallo einfach der folgende Code für wackelEreignis: I shake Ereignis für lineares Layout bin Hinzufügen

Anmerkung 1: ein Ordner anim erstellen und shake.xml erstellen und den folgenden Code hinzufügen

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="1000" 
android:fromXDelta="0" 
android:interpolator="@anim/test" 
android:toXDelta="30" /> 

erstellen test.xml und fügen Sie den folgenden Code:

<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
android:cycles="7" /> 

Anmerkung 2: verwenden Sie den folgenden Code in der Klasse.

private Animation shake; 
    private LinearLayout linearLayout; 

// Nach onCreate den folgenden Code einfügen

linearLayout = (LinearLayout) findViewById(R.id.test); 
shake = AnimationUtils.loadAnimation(this, R.anim.shake); 

// wir den Code unten auf den Knopf drücken oder wie pro Ihre Anforderung

linearLayout.startAnimation(shake); 
Verwandte Themen