Android開發學習之搖一搖

jopen 11年前發布 | 31K 次閱讀 Android Android開發 移動開發

        自從微信里的搖一搖功能為大家所熟知了以后,似乎搖一搖已經成了移動應用不可缺少的功能,不管什么類型的應用,只有加上了搖一搖才顯得足夠時尚。其實對于一款產品而言,我們真正應該關注的是用戶需要什么,而不是很主觀地去強迫用戶適應這種看似很殺手級的功能。要知道,在用戶的手機里,你只是眾多應用中的一個而已,下一秒鐘用戶會選擇誰,我們都不知道。好了,閑話少敘,我們都知道搖一搖是充分發揮了手機的硬件優勢,即傳感器。在安卓中和 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();  
      }  
   }  
}  </pre>         這個程序中最重要的方法是 onSensorChanged(),即當傳感器發生變化時要觸發的事件。這里我們做了兩個限定,一個是時間 mInterval,一個是加速度mSpeed。前者是為了避免傳感器一直處于“搖晃”狀態,后者是為了判斷什么時候“搖晃”可以起作用。程序最終運行效果如下:<br />

20131201014136328.png20131201014136328.png

來自:http://blog.csdn.net/qinyuanpei/article/details/17051217

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!