实现一摇事件事件

2023-09-06 17:01:43 作者:刀伐戏子

我无法搞清楚如何实现从这个答案的code。 安卓:我想动摇它

我是否需要创建一个方法,并使用if语句找到,如果mAccel大于0?

 包your.shake.namespace;

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

 公共类ShakeListener延伸活动{

TextView的显示;
振动器伏;

保护无效的onCreate(包savedInstanceState){
    // TODO自动生成方法存根
    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;
        显示器=(TextView中)findViewById(R.id.tvText);
        V =(震动)getSystemService(Context.VIBRATOR_SERVICE);
}

私人的SensorManager mSensorManager;
  私人浮动mAccel; //从重力加速度开
  私人浮动mAccelCurrent; //当前加速度包括重力
  私人浮动mAccelLast; //最后加速包括重力

  私人最终SensorEventListener mSensorListener =新SensorEventListener(){

    公共无效onSensorChanged(SensorEvent SE){
      浮X = se.values​​ [0];
      浮Y = se.values​​ [1];
      浮Z = se.values​​ [2];
      mAccelLast = mAccelCurrent;
      mAccelCurrent =(浮动)的Math.sqrt((双)(X * X + Y * Y + Z * Z));
      浮动三角洲= mAccelCurrent  -  mAccelLast;
      mAccel = mAccel * 0.9F +增量; //执行低切滤波器


    }

    公共无效onAccuracyChanged(传感器传感器,诠释精度){
    }
  };

  //我的code 3_29_12
公共无效摇(){

    如果(mAccel> 2.00f){
        v.vibrate(100);
    }
    其他{
        mAccel = 0.00f;

        }

}




  @覆盖
  保护无效onResume(){
    super.onResume();
    mSensorManager.registerListener(mSensorListener,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
  }

  @覆盖
  保护无效的onStop(){
    mSensorManager.unregisterListener(mSensorListener);
    super.onStop();
  }
 

解决方案

我觉得这个力量让事情变得更容易。

创建一个新的类名为 振动筛 并添加此。

 公共类摇床{
私人的SensorManager经理= NULL;
私人长lastShakeTimestamp = 0;
私人双阈值= 1.0D;
私人长间隙= 0;
私人Shaker.Callback CB = NULL;

公共振荡器(上下文ctxt,双门限,长的差距,Shaker.Callback CB){
    this.threshold =阈值*阈值;
    this.threshold = this.threshold * SensorManager.GRAVITY_EARTH
            * SensorManager.GRAVITY_EARTH;
    this.gap =差距;
    this.cb = CB;

    经理=(的SensorManager)ctxt.getSystemService(Context.SENSOR_SERVICE);
    mgr.registerListener(监听器,
            mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
            SensorManager.SENSOR_DELAY_UI);
}

公共无效的close(){
    mgr.unregisterListener(听众);
}

私人无效isShaking(){
    长今= SystemClock.uptimeMillis();
    尝试 {
        如果(lastShakeTimestamp == 0){
            lastShakeTimestamp =现在;

            如果(CB!= NULL){
                cb.shakingStarted();
            }
        } 其他 {
            lastShakeTimestamp =现在;
        }
    }赶上(NullPointerException异常E){

    }
}

私人无效isNotShaking(){
    长今= SystemClock.uptimeMillis();

    如果(lastShakeTimestamp大于0){
        如果(现在 -  lastShakeTimestamp>间隙){
            lastShakeTimestamp = 0;

            如果(CB!= NULL){
                cb.shakingStopped();
            }
        }
    }
}

公共接口回调{
    无效shakingStarted();

    无效shakingStopped();
}

私人最终SensorEventListener监听器=新SensorEventListener(){
    @覆盖
    公共无效onSensorChanged(SensorEvent E){
        如果(e.sensor.getType()== Sensor.TYPE_ACCELEROMETER){
            双netForce = e.values​​ [0] * e.values​​ [0];

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

            如果(阈值< netForce){
                isShaking();
            } 其他 {
                isNotShaking();
            }
        }
    }

    @覆盖
    公共无效onAccuracyChanged(传感器传感器,诠释精度){
        //未使用
        }
    };
}
 
全国8省,1000多家门店开启微信周边5公里摇一摇

在你的活动实施 Shaker.Callback 和使用方法 shakingStarted() shakingStopped()来实际做一些事情。

I'm having trouble figuring out how to implement the code from this answer. Android: I want to shake it!

Do I need to create a method and use an if statement to find if mAccel is greater than 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();
  }

解决方案

I think this might makes things easier for you.

Create a new Class called Shaker and add this.

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 your Activity implement Shaker.Callback and use the methods shakingStarted() and shakingStopped() to actually do something.