Android重力感应飘树叶,晃动掉元宝

本文介绍了如何在Android中利用重力感应器创建动态效果,如飘动的树叶和掉落的元宝。主要步骤包括获取Sensor对象,创建SensorEventListener监听器,注册和注销监听器,以及处理重力变化的函数。
摘要由CSDN通过智能技术生成

图呢,,,,,自己想想吧、、、、、、、画面很美。

package com.example.propertyanimsecdemo;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.provider.ContactsContract.CommonDataKinds.Event;
import android.sax.StartElementListener;
import android.util.Log;
import android.widget.TextView;

public class SensorManagerHelper implements SensorEventListener {

	/**
	 * 上下文
	 */
	private Context mContext;

	/**
	 * 传感器管理器
	 */
	private SensorManager mSensorManager;

	/**
	 * 传感器
	 */
	private Sensor mSensor;

	/**
	 * 手机上一个位置时重力感应坐标
	 */
	private float LX, LY, LZ;

	/**
	 * 晃动监听
	 */
	private OnShakeListener mShakeListener;
	/**
	 * 速度阈值,当摇晃速度达到这值后产生作用
	 */
	private static final int SPEED_SHRESHOLD = 5000;
	/**
	 * 两次检测的时间间隔
	 */
	private static final int UPTATE_INTERVAL_TIME = 50;
	/**
	 * 某轴上的速度s/t
	 */
	private static final int SPEED_XYZ = 500;
	/**
	 * 上次晃动检测时间
	 */
	private long lastShakeTime;

	public SensorManagerHelper(Context mContext) {
		super();
		this.mContext = mContext;
		start();
	}

	public void start() {
		// 获取传感器管理器
		mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
		if (mSensorManager != null) {
			// 获取重力传感器
			mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		}
		if (mSensor != null) {
			// 注册listener,第三个参数是检测的精确度
			// SENSOR_DELAY_FASTEST 最灵敏 因为太快了没必要使用
			// SENSOR_DELAY_GAME 游戏开发中使用
			// SENSOR_DELAY_NORMAL 正常速度
			// SENSOR_DELAY_UI 最慢的速度
			mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI);
		}
	}

	public void stop() {
		mSensorManager.unregisterListener(this);
	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		long curShakeTime = System.currentTimeMillis();// 当前时间
		long deltaT = curShakeTime - lastShakeTime;// 两次时间差
		if (deltaT < UPTATE_INTERVAL_TIME) {
			return;
		}
		lastShakeTime = curShakeTime;
		// 获取当前x,y,z坐标
		float CX = event.values[0];
		float CY = event.values[1];
		float CZ = event.values[2];
		
		// 坐标差
		float deltaX = CX - LX;
		float deltaY = CY - LY;
		float deltaZ = CZ - LZ;
		LX = CX;
		LY = CY;
		LZ = CZ;
		double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / deltaT * 10000;
		// 达到速度阀值,发出提示
		if (speed >= SPEED_SHRESHOLD)
			mShakeListener.onShake();
		if ((7<Math.abs(CX)&&Math.abs(CX)<10&&Math.abs(deltaX/deltaT*10000)>SPEED_XYZ)||(7<Math.abs(CY)&&Math.abs(CY)<10&&Math.abs(deltaY/deltaT*10000)>SPEED_XYZ)||(7<Math.abs(CZ)&&Math.abs(CZ)<10&&Math.abs(deltaZ/deltaT*10000)>SPEED_XYZ)) {
			mShakeListener.onSensor();
		}
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
	}

	// 摇晃监听接口
	public interface OnShakeListener {
		/**
		 * 晃动监听回调
		 */
		public void onShake();
		/**
		 * 重力监听回调
		 */
		public void onSensor();
	}

	/**
	 * 设置晃动监听
	 * 
	 * @param mShakeListener
	 */
	public void setmShakeListener(OnShakeListener mShakeListe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值