android 摇一摇功能的实现

将这个功能封装成了一个类,这样今后方便调用

package com.bobo.myyaoyiyaotest;



import android.R.bool;

import android.content.Context;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;



public class ShakeListener implements SensorEventListener {

    String TAG = "ShakeListener";

    // 速度阈值,当摇晃速度达到这值后产生作用

    // 两次检测的时间间隔

    private static final int UPTATE_INTERVAL_TIME = 300;

    // 传感器管理器

    private SensorManager sensorManager;

    // 传感器

    private Sensor sensor;

    // 重力感应监听器

    private OnShakeListener onShakeListener;

    // 上下文

    private Context mContext;

    // 手机上一个位置时重力感应坐标

    private float[] lastValues = { 0, 0, 0 };

    private float[] curValues = { 0, 0, 0 };



    // 上次检测时间

    private long lastUpdateTime;

    private long curUpdateTime;



    // 构造器

    public ShakeListener(Context c) {

        // 获得监听对象

        mContext = c;

        start();

    }



    // 开始

    public void start() {

        // 获得传感器管理器

        sensorManager = (SensorManager) mContext

                .getSystemService(Context.SENSOR_SERVICE);

        if (sensorManager != null) {

            // 获得重力传感器

            sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        }

        // 注册

        if (sensor != null) {

            sensorManager.registerListener(this, sensor,

                    SensorManager.SENSOR_DELAY_GAME);

        }

    }



    // 停止检测

    public void stop() {

        sensorManager.unregisterListener(this);

    }



    // 设置重力感应监听器

    public void setOnShakeListener(OnShakeListener listener) {

        onShakeListener = listener;

    }



    private boolean isShake = false;



    // 重力感应器感应获得变化数据

    public void onSensorChanged(SensorEvent event) {

        // 现在检测时间

        curUpdateTime = System.currentTimeMillis();

        curValues = event.values;

        // 两次检测的时间间隔

        long timeInterval = curUpdateTime - lastUpdateTime;

        // 判断是否达到了检测时间间隔

        if (timeInterval < UPTATE_INTERVAL_TIME)

            return;

        isShake = false;

        lastUpdateTime = curUpdateTime;

        // 现在的时间变成last时间

        if (!isShake && (curValues[0] - lastValues[1] > 20)) {

            isShake = true;

            onShakeListener.onShake();

        }

        lastValues = curValues;

    }



    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }



    // 摇晃监听接口

    public interface OnShakeListener {

        public void onShake();

    }

}

注意这里面定义了一个OnShakeListener的接口,可以在调用的方法中,实现该接口,利用setOShakeListener方法赋予其即可。

package com.bobo.myyaoyiyaotest;



import com.bobo.myyaoyiyaotest.ShakeListener.OnShakeListener;



import android.os.Bundle;

import android.os.Vibrator;

import android.app.Activity;

import android.view.Menu;



public class MainActivity extends Activity {

    private Vibrator mVibrator = null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Vibrator vibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);

        ShakeListener listener=new ShakeListener(this);

        listener.setOnShakeListener(new OnShakeListener() {

            

            @Override

            public void onShake() {

                    //这里仅仅需要执行摇一摇之后的操作即可。

                mVibrator.vibrate(new long[]{10,1000}, -1);

            }

        });

        

    }



    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.activity_main, menu);

        return true;

    }



}

这种耦合,以及回调的思想可谓极好

你可能感兴趣的:(android)