2012年8月30日 星期四

Android:藉由VelocityTracker偵測觸控滑動方向


package com.example.mytouch2;

import...

public class MainActivity extends Activity {
private TextView msg;
private StringBuilder data;
//宣告觸控速率追蹤物件之變數
private VelocityTracker tracker;
private LinearLayout rootlayout;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data = new StringBuilder();
msg = (TextView) findViewById(R.id.msg);
msg.setTextSize(26);
rootlayout = (LinearLayout) findViewById(R.id.rootlayout);
//註冊觸控監聽物件以及處理
rootlayout.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View view, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:
data.delete(0, data.length());
msg.setText("");
//取得觸控速率追蹤物件
tracker = VelocityTracker.obtain();
break;

case MotionEvent.ACTION_MOVE:
// 將觸控相關情境資料加入tracker中
tracker.addMovement(event);
break;

case MotionEvent.ACTION_UP:
// 計算目前速率,以每微秒1個像素為單位
tracker.computeCurrentVelocity(1);
/*
* 判斷X分量與Y分量何者較大(必須取絕對值),
* |x|>|Y|代表為接近水平方向, 其中,X>0為向右;X<0為向左
* |x|>|Y|代表為接近垂直方向, 其中,Y>0為向下;Y<0為向上                                
*/
if (Math.abs(tracker.getXVelocity()) > Math.abs(tracker
.getYVelocity())) {
if (tracker.getXVelocity() > 0) {
// 水平,向右
msg.setText(String.format("水平(左->右)X:%.4f%nY:%.4f",
tracker.getXVelocity(),
tracker.getYVelocity()));
rootlayout.setBackgroundColor(Color.BLUE);
} else {
// 水平向左
msg.setText(String.format("水平(右->左)X:%.4f%nY:%.4f",
tracker.getXVelocity(),
tracker.getYVelocity()));
rootlayout.setBackgroundColor(Color.YELLOW);
}

} else {
if (tracker.getYVelocity() > 0) {
// 垂直向下
msg.setText(String.format("垂直(上->下)X:%.4f%nY:%.4f",
tracker.getXVelocity(),
tracker.getYVelocity()));
rootlayout.setBackgroundColor(Color.RED);
} else {
// 垂直向上
msg.setText(String.format("垂直(上->下)X:%.4f%nY:%.4f",
tracker.getXVelocity(),
tracker.getYVelocity()));
rootlayout.setBackgroundColor(Color.GREEN);
}

}
break;

}

return true;
}

});

}

}

沒有留言:

張貼留言