2012-01-11 9 views
0

Ping-pongラケットのようにデバイスを上下に動かすと、スクリーンにはダイスが投げられるアンドロイドゲームのダイスゲームがあります。デバイスの上下(ピンポン)動作をどのように検出できますか?

私はこのデバイスの動きを検出したいと思います。どうやってやるの?

おかげで、活動に

+0

が重複する可能性(HTTP [残りの部分から縦方向に携帯電話の動きを計算する方法?] ://stackoverflow.com/questions/6291110/how-to-calculate-phones-movement-in-the-vertical-d方向転換から) – fyr

答えて

1
package org.mabna.order.utils; 

public interface OnDeviceShakeListener { 
    public abstract void onDeviceShaked(); 
} 

import java.util.ArrayList; 

import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 

public class SensorListener implements SensorEventListener { 

    float[] xVals = new float[] { 0, 0, 0 }; 
    float[] yVals = new float[] { 0, 0, 0 }; 
    long prevTime = 0; 

    final float angle = 10; 
    final long time = 100 * 1000 * 1000; // in nanosecond 

    public SensorListener() 
    { 

    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     synchronized (this) { 

      if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { 
       if (event.timestamp - prevTime > time) 
       { 
        prevTime = event.timestamp; 

        xVals[0] = xVals[1]; 
        xVals[1] = xVals[2]; 
        xVals[2] = event.values[1]; 

        yVals[0] = yVals[1]; 
        yVals[1] = yVals[2]; 
        yVals[2] = event.values[2]; 

        if (degreeChanged(xVals) || 
          degreeChanged(yVals)) 
        { 
         OnDeviceShaked(); 
        } 
       } 

      } 

     } 
    } 

    private boolean degreeChanged(float[] V) { 

     float v0 = Math.abs(V[0]); 
     float v1 = Math.abs(V[1]); 
     float v2 = Math.abs(V[2]); 

     boolean hasAngle = ((v1 - v0) > angle && (v1 - v2) > angle); 

     return hasAngle; 
    } 

    // DeviceShakeListener ---------------------------------------------------- 

    ArrayList<OnDeviceShakeListener> arrOnDeviceShakeListener = 
      new ArrayList<OnDeviceShakeListener>(); 

    /** 
    * Listens if device is shaken like a Ping-pong racket. 
    * 
    * @param listener 
    */ 
    public void setOnDeviceShakeListener(
      OnDeviceShakeListener listener) { 
     arrOnDeviceShakeListener.add(listener); 
    } 

    public void clearOnDeviceShakeListener(
      OnDeviceShakeListener listener) { 
     arrOnDeviceShakeListener.remove(listener); 
    } 

    // This function is called after the new point received 
    private void OnDeviceShaked() { 
     // Check if the Listener was set, otherwise we'll get an Exception when 
     // we try to call it 
     if (arrOnDeviceShakeListener != null) { 
      // Only trigger the event, when we have any listener 

      for (int i = arrOnDeviceShakeListener.size() - 1; i >= 0; i--) { 
       arrOnDeviceShakeListener.get(i).onDeviceShaked(); 
      } 
     } 
    } 

} 

:の

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
      sensorHandler = new SensorListener(); 
      sensorHandler.setOnDeviceShakeListener(new OnDeviceShakeListener() { 
       @Override 
       public void onDeviceShaked() { 
        //.... 
       } 
      }); 
+0

デバイスが「垂直」に揺れていることをどのように知ることができますか?私のデバイスがダウンしているときを検出する方法を意味しますか? –