Android開發祕籍學習筆記(十一)

  作爲一個大學狗,前一個月爲了一系列課程大作業和期末考試。所以暫停了博客的續寫,從今天開始又開始了《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,這裏佈局文件的代碼就不給出了~
效果展示:

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



發佈了41 篇原創文章 · 獲贊 12 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章