天天看點

Android開發秘籍學習筆記(十一)方法一:實作setOnTouchListener監聽器方法二:建構手勢探測器

  作為一個大學狗,前一個月為了一系列課程大作業和期末考試。是以暫停了部落格的續寫,從今天開始又開始了《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,這裡布局檔案的代碼就不給出了~ 效果展示:

Android開發秘籍學習筆記(十一)方法一:實作setOnTouchListener監聽器方法二:建構手勢探測器

 可以看到,這裡同樣是通過坐标的變化來判斷到底是向哪個方向滑動,不過這裡多了個參數velocity(速度)。