2012-01-11 3 views
0

Игра в кости в андроид-играх, когда вы двигаетесь вверх и вниз по своему устройству, как ракетка для пинг-понга, она бросает кубики на экран.Как я могу обнаружить движение устройства (вверх по пинг-понг)?

Я хочу обнаружить это движение устройства. Как я могу это сделать?

Спасибо,

+0

возможно дубликат [как рассчитать движение телефона в вертикальном направлении от остальных?] (HTTP : //stackoverflow.com/questions/6291110/how-to-calculate-phones-movement-in-the-vertical-d irection-from-rest) – 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

Как узнать, когда устройство трясет «вертикально»? Я имею в виду, как обнаружить, когда мое устройство идет вниз? –

Смежные вопросы