2013年5月6日

【Android】體感(Sensor)搖一搖,甩動觸發事件開發實作

嘻嘻,各位Android安卓開發者大家好啊!

今天小黑人要分享給大家的是"體感"也就是所謂的"Sensor",或許大部分的開發者可能比較少接觸過體感(Sensor)這個功能,但是體感(Sensor)其實是非常強大而且我們在生活中常常會使用到,舉個例來說像"手機直向橫向翻轉"、"知名的通訊軟體LINE與微信中搖一搖功能"、"地圖座標裡方位的旋轉"...等等其實都有運用到體感(Sensor)的部分,在特定的開發族群裡這塊神秘的體感(Sensor)運用相信一定練得非常厲害了,但沒接觸過的開發者也不要氣餒,體感(Sensor)這一塊真的還蠻有趣的,可以嘗試著寫寫練習看看,相信一定會有不錯的體驗唷! ^^

總而言之,今天小黑人就要向大家介紹"簡單運用體感(Sensor) )搖一搖、甩動開發實作"。
首先體感(Sensor)不需要在layout與AndroidManifest.xml裡做排版與權限的設置,所以我們就直接進入程式 (.java)裡進行體感(Sensor)的程式撰寫吧!

1.宣告建構參數 :
private SensorManager mSensorManager;   //體感(Sensor)使用管理
private Sensor mSensor;                 //體感(Sensor)類別
private float mLastX;                    //x軸體感(Sensor)偏移
private float mLastY;                    //y軸體感(Sensor)偏移
private float mLastZ;                    //z軸體感(Sensor)偏移
private double mSpeed;                 //甩動力道數度
private long mLastUpdateTime;           //觸發時間

//甩動力道數度設定值 (數值越大需甩動越大力,數值越小輕輕甩動即會觸發)
private static final int SPEED_SHRESHOLD = 3000;

//觸發間隔時間
private static final int UPTATE_INTERVAL_TIME = 70;

2.啟動體感(Sensor) :
@Override
protected void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
               
    //取得體感(Sensor)服務使用權限
        mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);

    //取得手機Sensor狀態設定
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    //註冊體感(Sensor)甩動觸發Listener
mSensorManager.registerListener(SensorListener, mSensor,SensorManager.SENSOR_DELAY_GAME);
}

3.體感(Sensor)觸發Listener
private SensorEventListener SensorListener = new SensorEventListener()
{
        public void onSensorChanged(SensorEvent mSensorEvent)
        { 
                //當前觸發時間
                long mCurrentUpdateTime = System.currentTimeMillis();
               
                //觸發間隔時間 = 當前觸發時間 - 上次觸發時間
                long mTimeInterval = mCurrentUpdateTime - mLastUpdateTime;

                //若觸發間隔時間< 70 則return;
                if (mTimeInterval < UPTATE_INTERVAL_TIME) return;

                mLastUpdateTime = mCurrentUpdateTime;

                //取得xyz體感(Sensor)偏移
                float x = mSensorEvent.values[0];
                float y = mSensorEvent.values[1];
                float z = mSensorEvent.values[2];

                //甩動偏移速度 = xyz體感(Sensor)偏移 - 上次xyz體感(Sensor)偏移
                float mDeltaX = x - mLastX;
                float mDeltaY = y - mLastY;
                float mDeltaZ = z - mLastZ;

                mLastX = x;
                mLastY = y;
                mLastZ = z;

                //體感(Sensor)甩動力道速度公式
                mSpeed = Math.sqrt(mDeltaX * mDeltaX + mDeltaY * mDeltaY + mDeltaZ * mDeltaZ)/ mTimeInterval * 10000;

                //若體感(Sensor)甩動速度大於等於甩動設定值則進入 (達到甩動力道及速度)
                if (mSpeed >= SPEED_SHRESHOLD)
                {
                        //達到搖一搖甩動後要做的事情
                        Log.d("TAG","搖一搖中...");
                }
        }
               
        public void onAccuracyChanged(Sensor sensor , int accuracy)
        { 
        } 
}; 

4.關閉移除體感(Sensor)觸發Listener
@Override
protected void onDestroy()
{
        super.onDestroy();
        //在程式關閉時移除體感(Sensor)觸發
        mSensorManager.unregisterListener(SensorListener);
}
以上就是結合體感(Sensor)運算出搖一搖及甩動的力道與速度,達到指定甩動速度則觸發事件的開發程式,各位開發者可以參考看看唷 ^^
希望大家可以互相交流,如有任何問題可以跟小黑人討論唷~~~謝謝大家!!! >///<

7 則留言:

  1. 這篇真的寫得很棒, 又清晰, 重點是可以work! XD

    回覆刪除
    回覆
    1. 您好,真的很感謝您的支持!!
      謝謝 ^ ^

      刪除
  2. 輸入後沒有任何錯誤,可以裝置手機,搖晃時沒有任何效果,請問哪裡需要修正?

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      如果Sensor沒有反應的話,可以先試著分析這段mSensorManager.registerListener(SensorListener, mSensor,SensorManager.SENSOR_DELAY_GAME)是否有註冊成功,
      也就是說在SensorListener內是否有被觸發,
      有註冊成功就會被觸發,沒成功就不會,先測看看後再決定下一步要如何解決!

      感謝您的提問!

      刪除
  3. 1.複製..
    2.複製..
    3.改if (mSpeed >= SPEED_SHRESHOLD)
    {
    num++;
    顯示num
    }
    4.沒打
    搖一下後就退出去畫面了....

    請問是我手機的問題嗎

    回覆刪除
    回覆
    1. 哈哈 找到原因了
      int num;
      t.setText(num); 會退掉
      t.setText(" "+num); 正常....
      抱歉了 是我自己的問題..

      刪除
  4. 小黑人 您好
    請問有辦法搖一搖開啟其他應用程式嗎?像是gmail、goole+、相機、相簿等等。

    回覆刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!