0

これは私が電話の揺れをキャプチャするために使用しているコードです:

    public void onSensorChanged(SensorEvent event) {
        Sensor mySensor = event.sensor;
        if (mySensor.getType() == SensorManager.SENSOR_ACCELEROMETER) {
            long curTime = System.currentTimeMillis();
            // only allow one update every 100ms.
            if ((curTime - lastUpdate) > 100) {
                long diffTime = (curTime - lastUpdate);
                lastUpdate = curTime;

                x = event.values[SensorManager.DATA_X];
                y = event.values[SensorManager.DATA_Y];
                z = event.values[SensorManager.DATA_Z];

                float speed = Math.abs(x+y+z - last_x - last_y - last_z)/ diffTime * 10000;
                if (speed > SHAKE_THRESHOLD_HIGH) {
                    // yes, this is a shake action! Do something about it!
                    handshake_score.setText(String.valueOf(speed));
                    new AlertDialog.Builder(Handshake.this)
                    .setCancelable(true)
                    .setIcon(android.R.drawable.ic_dialog_info)
                    .setTitle("noo")
                    .setMessage("too much") 
                    .setPositiveButton("OK!", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.cancel();
                            }
                        })
                    .show();

                    last_x = x;
                    last_y = y;
                    last_z = z;

                } else if (speed > SHAKE_THRESHOLD_PASS) {
                    // yes, this is a shake action! Do something about it!
                    handshake_score.setText(String.valueOf(speed));
                    sensorMgr.unregisterListener(this);
                    new AlertDialog.Builder(Handshake.this)
                    .setCancelable(true)
                    .setIcon(android.R.drawable.ic_dialog_info)
                    .setTitle("HAHAA!")
                    .setMessage("good") 
                    .setPositiveButton("OK!", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.cancel();
                            }
                        })
                    .show();

                    finish();

                } else if (speed > SHAKE_THRESHOLD_SMALL) {
                    // yes, this is a shake action! Do something about it!
                    handshake_score.setText(String.valueOf(speed));
                    new AlertDialog.Builder(Handshake.this)
                    .setCancelable(true)
                    .setIcon(android.R.drawable.ic_dialog_info)
                    .setTitle("boo")
                    .setMessage("not enough") 
                    .setPositiveButton("OK!", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.cancel();
                            }
                        })
                    .show();

                    last_x = x;
                    last_y = y;
                    last_z = z;
                }
                last_x = x;
                last_y = y;
                last_z = z;
            }
        }           
  }

私がやりたいのは、握手を模倣して、横向きの画面を向いているかのように携帯電話を水平に持って上下に動かしたときに、携帯電話を上下に持ち上げることに反応するようにすることです。

このコードは、電話を長さ軸を中心に回転させるかのように電話をひねることに対応しています。

誰かがこのコードで使用されている座標x、y、zの背後にあるロジックを説明できますか?これらは電話の場所の観点から、そしてどのように私がフェーンをあなたの手でねじるのではなく「握手」に応答させることができるかを説明できますか?

そのようなコードのアイデアはありますか?

4

1 に答える 1

0

これをアクティビティクラスに追加します

/* put this into your activity class */
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) {
}
 };

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

そして、これをonCreateメソッドに追加します。

 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;

これがお役に立てば幸いです

于 2012-01-12T06:16:59.183 に答える