1.传感有十种差不多
我们通过卫衣来传感
首先有位移传感工具类继承于传感监听,并在Manifest清单列表中添加
Vibrator权限
import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.provider.Settings; /** * Created by Administrator on 2016/6/14. */ public abstract class ShakeListener implements SensorEventListener{ private int duration=100;//采样时间间隔 private long lastTime;//上一个采样的时间 private float lastPointX;//上个点的X轴的加速度信息 private float lastPointY;//上个点的Y轴的加速度信息 private float lastPointZ;//上个点的Z轴的加速度信息 private float shake;//单次增量 private float totalShake;//总增量 private float switchValue=100;//判断是否摇晃手机的最大值 public ShakeListener(){ init(); } /** * 初始化赋值 */ private void init(){ lastTime=0; lastPointX=0; lastPointY=0; lastPointZ=0; shake=0; totalShake=0; } /** * //当传感器的值发生变化时触发的方法 * @param event */ @Override public void onSensorChanged(SensorEvent event) { if(lastTime==0){ lastTime=System.currentTimeMillis(); lastPointX=event.values[SensorManager.DATA_X]; lastPointY=event.values[SensorManager.DATA_Y]; lastPointZ=event.values[SensorManager.DATA_Z]; }else{ long currentTime=System.currentTimeMillis(); if(currentTime-lastTime>duration){ //第二个点 float x=event.values[SensorManager.DATA_X]; float y=event.values[SensorManager.DATA_Y]; float z=event.values[SensorManager.DATA_Z]; //每次传入的数据都存在微小的变动 float dx=Math.abs(x-lastPointX); float dy=Math.abs(y-lastPointY); float dz=Math.abs(z-lastPointZ); if (dx<1){ dx = 0; } if(dy<1){ dy = 0; } if (dz<1){ dz = 0; } shake = dx + dy + dz; if (shake==0){ //处于静止状态 init(); } totalShake += shake; if (totalShake > switchValue){ //说明是在摇晃手机 //机选一注彩票,并且有震动 shakeCreateLottery(); init(); }else{ lastTime = System.currentTimeMillis(); lastPointX=event.values[SensorManager.DATA_X]; lastPointY=event.values[SensorManager.DATA_Y]; lastPointZ=event.values[SensorManager.DATA_Z]; } } } } //当传感器的精度发生变化时触发该方法 @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } public abstract void shakeCreateLottery(); } 在Activity中添加服务 变量:private ShakeListener shakeListener; private SensorManager sensorManager;private void vibrator() { //先判断是否为空,进行调用系统服务的传感器服务 if (vibrator == null) { vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); } //震动时间 vibrator.vibrate(200); } //在onStart()之后调用onResume()@Override protected void onResume() { super.onResume(); shakeListener = new ShakeListener() { @Override public void shakeCreateLottery() { screateLottery(); } }; initShake(); } //注册传感器 private void initShake(){ sensorManager = (SensorManager)this.getSystemService(Context.SENSOR_SERVICE); sensorManager.registerListener(shakeListener,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),sensorManager.SENSOR_DELAY_FASTEST); }
在需要传感器时调用上方法
在最后要撤销该方法@Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(shakeListener); }