Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

Android开发学习之摇一摇

$
0
0

          自从微信里的摇一摇功能为大家所熟知了以后,似乎摇一摇已经成了移动应用不可缺少的功能,不管什么类型的应用,只有加上了摇一摇才显得足够时尚。其实对于一款产品而言,我们真正应该关注的是用户需要什么,而不是很主观地去强迫用户适应这种看似很杀手级的功能。要知道,在用户的手机里,你只是众多应用中的一个而已,下一秒钟用户会选择谁,我们都不知道。好了,闲话少叙,我们都知道摇一摇是充分发挥了手机的硬件优势,即传感器。在安卓中和Notofication类似,我们有SensorManager和Sensor两个类供我们使用。先来说一下,摇一摇的原理。摇一摇的原理是基于手机里的加速度传感器,当用户摇晃手机时,在X、Y、Z三个方向的加速度会发生变化。其中,X方向值的大小代表手机水平移动,Y方向值的大小代表手机垂直移动,Z方向值的大小代表手机的空间垂直方向,天空的方向为正,地球的方向为负,然后把相关的加速度值传输给操作系统,通过判断其大小变化,就能判断用户是否摇晃手机啦。对于Android而言,其本身就提供了很好的API接口,因设备而已,实际使用时,用户手机中可能并没有这样的传感器,所以对于Android开发而言,绝对不能想当然地认为程序写对了就一定没什么问题啦(真心不想吐槽Android的屏幕、各种因为被阉割而形同虚设的API)。Android中开发传感器相关的应用,必须实现SensorEventListener接口。下面我们以一个例子来展示这个接口的实现:

package com.Android.Shake2Shake;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.Toast;



public class ShakeHelper implements SensorEventListener
{
   private Context mContext;
   //传感器管理器
   private SensorManager mSensorManager;
   //传感器
   private Sensor mSensor;
   //速度阀值
   private int mSpeed=3000;
   //时间间隔
   private int mInterval=50;
   //上一次摇晃的时间
   private long LastTime;
   //上一次的x、y、z坐标
   private float LastX,LastY,LastZ;
   public ShakeHelper(Context mContext)
   {
	   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)
	   {
		   mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_GAME);
	   }
   }

   public void Stop()
   {
	   mSensorManager.unregisterListener(this);
   }
   
   @Override
   public void onAccuracyChanged(Sensor arg0, int arg1) 
   {
	 
   }

   @Override
   public void onSensorChanged(SensorEvent Event) 
   {
	  long NowTime=System.currentTimeMillis();
	  if((NowTime-LastTime)<mInterval)
      return;
	  //将NowTime赋给LastTime
	  LastTime=NowTime;
	  //获取x,y,z
	  float NowX=Event.values[0];
	  float NowY=Event.values[1];
	  float NowZ=Event.values[2];
	  //计算x,y,z变化量
	  float DeltaX=NowX-LastX;
	  float DeltaY=NowY-LastY;
	  float DeltaZ=NowZ-LastZ;
	  //赋值
	  LastX=NowX;
	  LastY=NowY;
	  LastZ=NowZ;
	  //计算
	  double NowSpeed = Math.sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ * DeltaZ)/mInterval * 10000;
	  //判断
	  if(NowSpeed>=mSpeed)
	  {
		  Toast.makeText(mContext, "你摇晃了手机!", Toast.LENGTH_SHORT).show();
	  }
   }
}
         这个程序中最重要的方法是 onSensorChanged(),即当传感器发生变化时要触发的事件。这里我们做了两个限定,一个是时间mInterval,一个是加速度mSpeed。前者是为了避免传感器一直处于“摇晃”状态,后者是为了判断什么时候“摇晃”可以起作用。程序最终运行效果如下:



            


作者:qinyuanpei 发表于2013-12-1 1:42:15 原文链接
阅读:131 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>