安卓摇一摇事件的实现

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

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

信号检测并处理: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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值