嘻嘻,各位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)運算出搖一搖及甩動的力道與速度,達到指定甩動速度則觸發事件的開發程式,各位開發者可以參考看看唷 ^^
希望大家可以互相交流,如有任何問題可以跟小黑人討論唷~~~謝謝大家!!! >///< |
|
這篇真的寫得很棒, 又清晰, 重點是可以work! XD
回覆刪除您好,真的很感謝您的支持!!
刪除謝謝 ^ ^
輸入後沒有任何錯誤,可以裝置手機,搖晃時沒有任何效果,請問哪裡需要修正?
回覆刪除您好,根據您的提問小黑人與您解釋,
刪除如果Sensor沒有反應的話,可以先試著分析這段mSensorManager.registerListener(SensorListener, mSensor,SensorManager.SENSOR_DELAY_GAME)是否有註冊成功,
也就是說在SensorListener內是否有被觸發,
有註冊成功就會被觸發,沒成功就不會,先測看看後再決定下一步要如何解決!
感謝您的提問!
1.複製..
回覆刪除2.複製..
3.改if (mSpeed >= SPEED_SHRESHOLD)
{
num++;
顯示num
}
4.沒打
搖一下後就退出去畫面了....
請問是我手機的問題嗎
哈哈 找到原因了
刪除int num;
t.setText(num); 會退掉
t.setText(" "+num); 正常....
抱歉了 是我自己的問題..
小黑人 您好
回覆刪除請問有辦法搖一搖開啟其他應用程式嗎?像是gmail、goole+、相機、相簿等等。