Android手机摇一摇之传感器开发
来源:互联网 发布:数控铣床编程基础知识 编辑:程序博客网 时间:2024/06/06 05:54
【声明】转载请注明出处,此文出自指尖飞落的博客: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;//判断手机摇晃的阈值@Overridepublic 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;//增量的累加}@Overridepublic 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);//通知更新UIredAdapter.notifyDataSetChanged();blueAdapter.notifyDataSetChanged();}
O(∩_∩)O哈哈~欢迎交流......
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆转载请注明出处☞指尖飞落的博客☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
- Android手机摇一摇之传感器开发
- android传感器学习之获取手机传感器
- android传感器学习之获取手机传感器
- Android开发之传感器
- 手机中的传感器之光线传感器(Android实现)
- Android学习之手机传感器的获取
- Android游戏开发之传感器
- Android游戏开发之传感器
- Android开发之重力传感器
- Android开发之重力传感器
- Android开发之重力传感器
- android 手机传感器配置
- android手机加速度传感器
- Android手机传感器介绍
- android开发(27) 看看我的手机里都有什么传感器
- Android开发之方向传感器的使用
- Android开发之方向传感器的使用
- Android开发之方向传感器的使用
- 格而知之1:UIButton中imageView和titleLabel的位置调整
- C++学习笔记(类型转换)
- OC学习,OC中得堆栈
- 线性可分支持向量机学习算法——最大间隔法
- hadoop集群安装(多机,非伪集群)
- Android手机摇一摇之传感器开发
- inline-block实现元素水平居中
- thinkphp C方法问题
- RAC修改归档目录
- reveal end of document
- Composite 模式——结构模式
- svn 升级带来的问题
- java String字符串
- 企业级WEB的负载均衡高可用之LVS+Keepalived