作爲一個大學狗,前一個月爲了一系列課程大作業和期末考試。所以暫停了博客的續寫,從今天開始又開始了《Android開發祕籍》(第二版)的學習!在Android開發祕籍學習筆記(十)中學習了Android如何截取物理按鍵事件,今天就學習下如何監聽滑動手勢。
在Android應用中,經常需要手勢滑動操作,而處理手勢滑動通常有兩種方法:一種單獨實現setOnTouchListener監聽器來實現,另一種就是構建手勢探測器。
方法一:實現setOnTouchListener監聽器
myView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPosX = event.getX();
mPosY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurPosX = event.getX();
mCurPosY = event.getY();
break;
case MotionEvent.ACTION_UP:
if (mCurPosY - mPosY > 0
&& (Math.abs(mCurPosY - mPosY) > 25)) {
//向下滑動
} else if (mCurPosY - mPosY < 0
&& (Math.abs(mCurPosY - mPosY) > 25)) {
//向上滑動
collapse();
}
break;
}
return true;
}
});
}
可以看到,我們通過MotionEvent獲取我們手觸碰手機的座標在獲取到我們手移動結束後的座標。再通過座標變化判斷我們到底是向哪個方向滑動。方法二:構建手勢探測器
- onDown():當按下事件發生時發出通知。
- onFling():當“按下並滑動一段距離再釋放”這一事件發生後發出通知。
- onLongPress():長按事件發生時發出通知。
- onScroll():發生滾動時發出通知,
- onShowPress():當按下時間在任何動作或釋放之前發生時發出通知。
- onSingleTapUp():當“按下後放開”事件發生時發出通知。
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private static final int LARGE_MOVE = 60;
private GestureDetector gestureDetector;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text_result);
gestureDetector = new GestureDetector(this ,new SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getY() - e2.getY() > LARGE_MOVE){
textView.append("\nFling Up with velocity" + velocityY);
}
if(e2.getY() - e1.getY() > LARGE_MOVE){
textView.append("\nFling Down with velocity" + velocityY);
}
if(e1.getX() - e2.getX() > LARGE_MOVE){
textView.append("\nFling Left with velocity" + velocityX);
}
if(e2.getX() - e1.getX() > LARGE_MOVE){
textView.append("\nFling Right with velocity" + velocityX);
}
return false;
}
});
}
public boolean onTouchEvent(MotionEvent event){
return gestureDetector.onTouchEvent(event);
}
}
在佈局文件中呢就定義了一個TextView,這裏佈局文件的代碼就不給出了~
可以看到,這裏同樣是通過座標的變化來判斷到底是向哪個方向滑動,不過這裏多了個參數velocity(速度)。