Fork me on GitHub

Android的传感器

震动

权限

 <uses-permission android:name="android.permission.VIBRATE" />

初始化

Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);

//设置初始化感应
ShakeListener  shakeListener = new ShakeListener(this);
shakeListener.setOnShake(onShake);
	/*
	 * 重力感应
	 */
private OnShakeListener onShake = new OnShakeListener() {

		@Override
		public void onShake() {
			imgnot.setVisibility(View.GONE);
			startVibrator();
			shakeListener.stop();
		}
	};
	/**
	 * 播放振动效果
	 */
	public void startVibrator() {
		vibrator.vibrate(new long[] { 500, 300, 500, 300 }, -1);
	}

//实现SensorListener接口
public class ShakeListener implements SensorEventListener {
	private static final int SPEED_SHRESHOLD = 3500;
	private static final int UPTATE_INTERVAL_TIME = 70;
	private Context context;
	private Sensor sensor;
	private SensorManager senmanager;
	private float last_x;
	private float last_y;
	private float last_z;
	private long lastUpDatetime;
	private OnShakeListener onShake;
	public ShakeListenerUtils(Context context) {
		this.context = context;
		start();
	}
	public void start() {
		//初始化
		senmanager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
		if (senmanager != null) {
			sensor = senmanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		}
		if (sensor != null) {
			senmanager.registerListener(this, SensorManager.SENSOR_ORIENTATION | SensorManager.SENSOR_ACCELEROMETER,SensorManager.SENSOR_DELAY_NORMAL,SensorManager.SENSOR_DELAY_GAME);
		}
	}
	public void stop() {
		senmanager.unregisterListener(this, sensor);
	}
	public void setOnShake(OnShakeListener onShake) {
		this.onShake = onShake;
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		//精确度改变的时候
		Log.d(tag, "onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);
	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		long currentUpDatetime = System.currentTimeMillis();
		long timeInterval = currentUpDatetime - lastUpDatetime;
		if (timeInterval < UPTATE_INTERVAL_TIME) {
			return;
		}
	synchronized (this) {
			Log.d(tag, "onSensorChanged: " + sensor + ", x: " + values[0] + ", y: " + values[1] + ", z: " + values[2]);
			//三维方向坐标
			if (sensor == SensorManager.SENSOR_ORIENTATION) {
				xViewO.setText("Orientation X: " + values[0]);
				yViewO.setText("Orientation Y: " + values[1]);
				zViewO.setText("Orientation Z: " + values[2]);
			}
			//三维方向的加速度
			if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
				xViewA.setText("Accel X: " + values[0]);
				yViewA.setText("Accel Y: " + values[1]);
				zViewA.setText("Accel Z: " + values[2]);
			}
		
		lastUpDatetime = currentUpDatetime;

		float x = event.values[0];
		float y = event.values[1];
		float z = event.values[2];

		float deltaX = x - last_x;
		float deltaY = y - last_y;
		float deltaZ = z - last_z;

		last_x = x;
		last_y = y;
		last_z = z;

		double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval * 10000;
		if (speed >= SPEED_SHRESHOLD) {
			onShake.onShake();
		}
	}
	public interface OnShakeListener {
		public void onShake();
	}
}
posted @ 2021-06-15 14:02  KevinAt2022  阅读(88)  评论(0)    收藏  举报