实施抖动事件



我很难弄清楚如何从这个答案中实现代码。安卓:我想摇一摇

我是否需要创建一个方法并使用if语句来查找mAccel是否大于0?

    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();
  }

我认为这可能会让事情变得更容易。

创建一个名为Shaker的新类并添加它

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
        }
    };
}

Activity中实现Shaker.Callback,并使用方法shakingStarted()shakingStopped()实际执行某些操作。

Hi简单地使用以下代码来处理shake事件:我正在为线性布局添加抖动事件

注意1:创建一个文件夹anim并创建shake.xml并添加以下代码

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

创建test.xml并添加以下代码:

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

注意2:在类中使用以下代码。

 private Animation shake;
    private LinearLayout linearLayout;

//创建后粘贴以下代码

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

//我们可以在按下按钮或根据您的要求使用以下代码

linearLayout.startAnimation(shake);

最新更新