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