Android手机摇一摇之传感器开发

【声明】转载请注明出处,此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail

——尊重作者,知识无价,交流无限!

一、手机摇晃计算

1、手机摇晃的动作

2、一个点三个轴X、Y、Z

①计算从a——b的增量:a点到b点各个轴相减之和

假设a(x1,y1,z1)、b(x2,y2,z2)

增量ab=(x2-x1)+(y2-y1)+(z2-z1)

②将所有的增量进行汇总,得到一个大的增量,假设是N。并进行判断:

如果N>=设定的域值M,则确定在摇晃手机。

说明:N=ab+bc+cd+......n;

③问题:手机传感器的反应(灵敏度)会因为手机的不同而有区别,主要是生产商的原因。

灵敏度以设置的采样时间间隔进行判断。

假设:A手机:a——b需要30ms(灵敏度高)

B手机:a——b需要90ms(灵敏度低)

图解:

得:A手机灵敏度>B手机

如何解决这个问题?我们可以以设置好的域值来进行处理。(详情看代码思路)

通过汇总与设置好的阈值进行比对,如果大于或等于。用户继续摇晃手机,否则继续记录当期的数据(加速度读和时间)

二、代码实现

代码思路:

1、记录第一个数据:三的轴的加速度。(为了屏蔽掉不同手机采样的时间间隔,记录第一个点的时间)

2、当有新的传感器数据传递后,判断时间间隔(用当前时间与第一个采样的时间进行比对,如果满足了时间间隔要求,认为是合格的第二个时间,记录下来。否则舍弃该数据包)

进行增量计算:获取到新的加速度值与第一个点上存储的轴的数据进行差值计算,获取到第一点和第二个点的增量。

③以此类推,获取到两个相邻点的增量进行以此汇总。

④通过汇总与设置好的阈值进行比对,如果大于或等于。用户继续摇晃手机,否则继续记录当期的数据(加速度读和时间)

1、手机摇晃处理。摇一摇随机选彩票ShakeListener.java

package com.yiyun.mobileblottery.view.sensor;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Vibrator;
//手机摇晃处理
public abstract class ShakeListener implements SensorEventListener {
	private float lastX;
	private float lastY;
	private float lastZ;
	private long lastTime;
	private Context context;
	//手机振动的处理
	private Vibrator vibrator;

	public ShakeListener(Context context) {
		super();
		this.context = context;
		vibrator=(Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
	}

	private long duretion=100;//指定时间间隔
	private float total;//增量的累加
	private float swiftValue=200;//判断手机摇晃的阈值

	@Override
	public void onSensorChanged(SensorEvent event) {
		//①判断是否为第一个点
		//如果时间为0,则为第一个点
		if (lastTime==0) {
			lastX=event.values[SensorManager.DATA_X];
			lastY=event.values[SensorManager.DATA_Y];
			lastZ=event.values[SensorManager.DATA_Z];
			//获得系统时间
			lastTime=System.currentTimeMillis();
		}else {
			//②第二个点的时间
			long currentTime=System.currentTimeMillis();
			//第一个点的时间-地二个点的时间>=指定时间间隔
			//这样做的目的是尽可能屏蔽掉不同手机的差异
			if ((currentTime-lastTime)>=duretion) {
				//第二个点及以后的点
				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-lastX);
				float dy=Math.abs(x-lastY);
				float dz=Math.abs(x-lastZ);

				//第一个点与第二个点总的增量
				float shake=dx+dy+dz;

				//③获取到两个相邻的增量进行汇总
				total+=shake;

				//④通过汇总与设置好的阈值进行比对,如果大于或等于,确定用户在摇晃手机。否则继续记录当期的数据(数据+时间)
				if (total>=swiftValue) {
					//摇晃手机的处理
					//①机选一注彩票
					randCure();
				    <span style="white-space:pre">	</span>//②提示用户(声音或振动)
					vibrator.vibrate(100);
					//③所有数据都要初始化
					init();
				}
			}
		}

	}

	/**
	 * 具体在这里做处理:摇晃机选一注彩票
	 * 以抽象处理,让子类实现具体方法
	 */
	public abstract void randCure();

	/**第二次摇
	 * 所有数据都要初始化
	 */
	private void init() {
		float lastX=0;
		float lastY=0;
		float lastZ=0;
		long lastTime=0;

		float total=0;//增量的累加
	}

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

	}
}

2、权限注册AndroidManifest.xml

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

3、子类实现的具体方法,选双色球PlaySSQ.java

/**
	 * 机选双色球
	 */
	protected void randomSSQ() {
		Random random=new Random();
		//机选红球
		//一般设置的数=size-1,设置33个红球的随机数
		int redNum=random.nextInt(33)+1;
		redNums.clear();//每次清空
		//每次点击机选彩票需要产生6个随机数红球
		while (redNums.size()<6) {
			//随机选择会有重复的,如果有重复的就不装载,继续随机
			//contains如果此列表中包含指定的元素,则返回 true。
			if (redNums.contains(redNum)) {
				continue;
			}
			redNums.add(redNum);
		}

		//机选篮球
		int blueNum=random.nextInt(16)+1;
		blueNums.add(blueNum);

		//通知更新UI
		redAdapter.notifyDataSetChanged();
		blueAdapter.notifyDataSetChanged();
	}

4、效果图

O(∩_∩)O哈哈~欢迎交流......

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆转载请注明出处?指尖飞落的博客☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-31 01:43:39

Android手机摇一摇之传感器开发的相关文章

基于C/S模式的android手机与PC机通信系统的开发

原文链接: http://blog.csdn.net/nupt123456789/article/details/8213486 基于C/S模式的android手机与PC机通信系统的开发 作者:郑海波 单位:南京邮电大学 通信与信息工程学院 信号与信息处理 6班 学号:1012010638 邮箱:[email protected] -----------------------------------------------------------------------------------

Android手机中的2048游戏Demo开发

Android中正火的2048游戏开发,赶紧开发一个自己的2048吧 1.游戏中的几个关键点 1)界面 2048游戏的操作界面就是一个4X4的方格.如下图所示: 游戏首先要绘制出该界面. @1 界面布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:

Unity3D Android手机屏幕分辨率问题

Android手机屏幕分辨率五花八门,导致开发时不好把握,还好各个引擎对这个屏幕分辨率问题都有较好的处理方式:unity3D 也为我们提供了一个不错的解决方案. 在Unity3D 进行 android 游戏开发时,对于不同分辨率下的显示效果就像是摄像机的自动平移了一般,看了不少游戏,对于 Unity3D 开发 android 游戏貌似都没有做相应的屏幕分辨率的处理,而是随摄像机的自动移动,把场景做大些不至于出现空白背景. 其实 Unity3D 开发3D游戏,对于不同的分辨率,我们只需要设置 1

Eclipse如何连接android手机,测试android程序?

前提:android开发环境已搭建好,以华为荣耀3X畅玩版为例. 1.将手机使用数据线连接到电脑,连接到电脑后,目前金山.360,等杀毒软件都有手机助手,自动会安装驱动(没有杀毒软件则下载驱动精灵,自动进行安装). 安装好驱动可在电脑的设备管理中看到(若尚未连接上手机可能显示驱动不正常,连上后就正常了),如下图: 2.打开手机设置->关于手机(滑到最后)->多次点击版本号,即可启用开发人员模式,启用后在设置中可见开发人员选项:其他品牌android手机设置里应该直接有开发人员选项,启用即可.

Android加速度传感器实现“摇一摇”,带手机振动

由于代码有点多,所以就分开写了,注释还算详细,方便学习 Activity package com.lmw.android.test; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Vibrator; import android.view.View; import android.widget.Toast; import com.lmw.and

Android 使用加速度传感器实现摇一摇功能及优化

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得传感器管理器的实例 sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 2.通过传感器管理器获得加速传感器 accelerateSensor = getSensorManager(cont

android音乐播放器开发 SweetMusicPlayer 摇一摇换歌

上一篇写了如何在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,现在来讲讲摇一摇功能开发. 同样用了一个Service去实现摇一摇. ShakeListener继承自SensorEventListener,当加速度感应器感受到重力变化,就去通知onShakeListener调用onShake(), 在震动的同时随机一首歌. 一,加速度感应器 在这里需要设置一个速度阈值和时间间隔,控制一定的时间间隔才能触发第二次震动

Android加速度传感器的使用:摇一摇功能的实现

一.原理介绍: Android手机中摇一摇的功能已经很常见了,最近接触到了这个功能,原理很简单:使用加速度传感器,在晃动手机时,监听加速度在各个方向的变化,当加速度值超过设定的灵敏度时,则触发摇一摇功能. 二.使用到的类: SensorManager SensorEventListener 三.功能实现: 1.摇一摇功能:我将摇一摇功能封装成了一个类ShakeUtils,在使用时按照注释中的说明使用即可,ShakeUtils.java如下(差的包请CTRL+SHIFT+O导入): /** * 摇

玩转Android之加速度传感器的使用,模仿微信摇一摇

Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇动手机的时候这里的动画效果基本和微信上的动画效果一致,这里请大家自行脑补微信摇一摇画面. 那我们就动手吧. 1.布局文件 好,那我们先来看看布局文件吧,在布局文件的正中央是一个花的图片,上图大家看到的手机图片实际上是两张图片拼接在一起,将花的那张图片遮住了,当摇一摇的时候,这两张图片分别向上或者向下