安卓摇一摇事件的实现

来源:互联网 发布:xtw100编程器 最新软件 编辑:程序博客网 时间:2024/05/02 08:47

安卓摇一摇这个功能在应用中很常见,比如说摇一摇搜索或摇一摇换壁纸等等等等。在安卓上是很容易实现的,原理就是监听手机自带的传感器,检测到手机加速等信号(摇一摇的信号)就进行处理。

下面两段代码分别是信号检测并处理的代码和一个接口类代码。

信号检测并处理:AccelerometerListener.java

import java.util.List;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.widget.Toast; public class AccelerometerManager {      private static Context aContext=null;              /** Accuracy configuration */    private static float threshold  = 15.0f;     private static int interval     = 100;      private static Sensor sensor;    private static SensorManager sensorManager;    // you could use an OrientationListener array instead    // if you plans to use more than one listener    private static AccelerometerListener listener;      /** indicates whether or not Accelerometer Sensor is supported */    private static Boolean supported;    /** indicates whether or not Accelerometer Sensor is running */    private static boolean running = false;      /**     * Returns true if the manager is listening to orientation changes     */    public static boolean isListening() {        return running;    }      /**     * Unregisters listeners     */    public static void stopListening() {        running = false;        try {            if (sensorManager != null && sensorEventListener != null) {                sensorManager.unregisterListener(sensorEventListener);            }        } catch (Exception e) {}    }      /**     * Returns true if at least one Accelerometer sensor is available     */    public static boolean isSupported(Context context) {        aContext = context;        if (supported == null) {            if (aContext != null) {                                                  sensorManager = (SensorManager) aContext.                        getSystemService(Context.SENSOR_SERVICE);                                 // Get all sensors in device                List<Sensor> sensors = sensorManager.getSensorList(                        Sensor.TYPE_ACCELEROMETER);                                 supported = new Boolean(sensors.size() > 0);                                                               } else {                supported = Boolean.FALSE;            }        }        return supported;    }      /**     * Configure the listener for shaking     * @param threshold     *             minimum acceleration variation for considering shaking     * @param interval     *             minimum interval between to shake events     */    public static void configure(int threshold, int interval) {        AccelerometerManager.threshold = threshold;        AccelerometerManager.interval = interval;    }      /**     * Registers a listener and start listening     * @param accelerometerListener     *             callback for accelerometer events     */    public static void startListening( AccelerometerListener accelerometerListener )     {                 sensorManager = (SensorManager) aContext.                getSystemService(Context.SENSOR_SERVICE);                 // Take all sensors in device        List<Sensor> sensors = sensorManager.getSensorList(                Sensor.TYPE_ACCELEROMETER);                 if (sensors.size() > 0) {                         sensor = sensors.get(0);                         // Register Accelerometer Listener            running = sensorManager.registerListener(                    sensorEventListener, sensor,                     SensorManager.SENSOR_DELAY_GAME);                         listener = accelerometerListener;        }                      }      /**     * Configures threshold and interval     * And registers a listener and start listening     * @param accelerometerListener     *             callback for accelerometer events     * @param threshold     *             minimum acceleration variation for considering shaking     * @param interval     *             minimum interval between to shake events     */    public static void startListening(            AccelerometerListener accelerometerListener,             int threshold, int interval) {        configure(threshold, interval);        startListening(accelerometerListener);    }      /**     * The listener that listen to events from the accelerometer listener     */    private static SensorEventListener sensorEventListener =         new SensorEventListener() {          private long now = 0;        private long timeDiff = 0;        private long lastUpdate = 0;        private long lastShake = 0;          private float x = 0;        private float y = 0;        private float z = 0;        private float lastX = 0;        private float lastY = 0;        private float lastZ = 0;        private float force = 0;          public void onAccuracyChanged(Sensor sensor, int accuracy) {}          public void onSensorChanged(SensorEvent event) {            // use the event timestamp as reference            // so the manager precision won't depends             // on the AccelerometerListener implementation            // processing time            now = event.timestamp;              x = event.values[0];            y = event.values[1];            z = event.values[2];              // if not interesting in shake events            // just remove the whole if then else block            if (lastUpdate == 0) {                lastUpdate = now;                lastShake = now;                lastX = x;                lastY = y;                lastZ = z;                Toast.makeText(aContext,"No Motion detected",                    Toast.LENGTH_SHORT).show();                             } else {                timeDiff = now - lastUpdate;                                if (timeDiff > 0) {                                          /*force = Math.abs(x + y + z - lastX - lastY - lastZ)                                 / timeDiff;*/                    force = Math.abs(x + y + z - lastX - lastY - lastZ);                                         if (Float.compare(force, threshold) >0 ) {                        Toast.makeText(Accelerometer.getContext(),                         (now-lastShake)+"  >= "+interval, 1000).show();                                                 if (now - lastShake >= interval) {                                                          // trigger shake event                            listener.onShake(force);                        }                        else                        {                            Toast.makeText(aContext,"No Motion detected",                                 Toast.LENGTH_SHORT).show();                                                     }                        lastShake = now;                    }                    lastX = x;                    lastY = y;                    lastZ = z;                    lastUpdate = now;                 }                else                {                    Toast.makeText(aContext,"No Motion detected", Toast.LENGTH_SHORT).show();                                     }            }            // trigger change event            listener.onAccelerationChanged(x, y, z);        }      };  }

接口类:AccelerometerListener.java

public interface AccelerometerListener {public void onAccelerationChanged(float x, float y, float z);      public void onShake(float force);}

接下来就是你的Activity代码了,在你代码中只要extends AccelerometerListener,然后完成onAccelerationChanged和onShake两个函数即可,在onShake函数中完成你想要的得到摇一摇信号后要处理的操作。示例代码如下:

import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.hardware.SensorListener; import android.view.MotionEvent; import android.view.View; import android.widget.Toast;public class ShowAndShare extends Activity implements AccelerometerListener{  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_show);   findviewbyid();   init();  }  public void init()  {     }    public void findviewbyid()  {     }    @Override  public void onAccelerationChanged(float x, float y, float z) {   // TODO Auto-generated method stub   }  @Override  public void onShake(float force) {   // TODO Auto-generated method stub   Toast.makeText(getBaseContext(), "Motion detected", Toast.LENGTH_SHORT).show();   //在这里做你想做的事情 }  @Override     public void onResume() {             super.onResume();             Toast.makeText(getBaseContext(), "onResume Accelerometer Started",                      Toast.LENGTH_SHORT).show();                           //Check device supported Accelerometer senssor or not             if (AccelerometerManager.isSupported(this)) {                                   //Start Accelerometer Listening                 AccelerometerManager.startListening(this);             }     }           @Override     public void onStop() {             super.onStop();                           //Check device supported Accelerometer senssor or not             if (AccelerometerManager.isListening()) {                                   //Start Accelerometer Listening                 AccelerometerManager.stopListening();                                   Toast.makeText(getBaseContext(), "onStop Accelerometer Stoped",                           Toast.LENGTH_SHORT).show();             }                  }           @Override     public void onDestroy() {         super.onDestroy();                  //Check device supported Accelerometer senssor or not         if (AccelerometerManager.isListening()) {                           //Start Accelerometer Listening             AccelerometerManager.stopListening();                           Toast.makeText(getBaseContext(), "onDestroy Accelerometer Stoped",                     Toast.LENGTH_SHORT).show();         }                   }}






0 0
原创粉丝点击