作為一個大學狗,前一個月為了一系列課程大作業和期末考試。是以暫停了部落格的續寫,從今天開始又開始了《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擷取我們手觸碰手機的坐标在擷取到我們手移動結束後的坐标。再通過坐标變化判斷我們到底是向哪個方向滑動。
方法二:建構手勢探測器
在本技巧中,将會有一個手勢檢測器(GestureDetector )來重寫onTouchEvent(),以設定一個手勢監聽器。OnGestureListener接口可以響應的手勢有以下幾個。
- onDown():當按下事件發生時發出通知。
- onFling():當“按下并滑動一段距離再釋放”這一事件發生後發出通知。
- onLongPress():長按事件發生時發出通知。
- onScroll():發生滾動時發出通知,
- onShowPress():當按下時間在任何動作或釋放之前發生時發出通知。
- onSingleTapUp():當“按下後放開”事件發生時發出通知。
如果隻需要上述手勢的一部分,可以繼承SimpleOnGestureListener類。如果前面提到的任一方法沒有顯示地實作,他就會傳回false。
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,這裡布局檔案的代碼就不給出了~ 效果展示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zN4QTOwkTNyIDNxcDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
可以看到,這裡同樣是通過坐标的變化來判斷到底是向哪個方向滑動,不過這裡多了個參數velocity(速度)。