2018/10/26

[Android] Swipe Gesture Detection

Android目前還沒有現成的函式可以判斷一些滑動的手勢,例如:向左滑、向右滑、向上滑、向下滑。
只好透過利用OnTouchListener來自己寫一個滑動手勢的判斷。
如果想要在一個ImageView圖片上判斷滑動的手勢,
先在xml檔裡面建立一個ImageView的物件,以及一個TextView顯示判斷結果。

接著在MainActivity.java裡先設定好前置作業:
private int swipe_d = 10; // threshold for swipe distance
private TextView tvText;
private ImageView ivImage;

onCreate中在要判斷的ImageView上設定一個setOnTouchListener:
tvText = (TextView)findViewById(R.id.id_tvText);
ivImage = (ImageView)findViewById(R.id.id_ivImage);
ivImage.setOnTouchListener(bgImgListener);

加入一個OnTouchListener的函式,透過觸控的x、y座標來判斷手勢操作
private View.OnTouchListener bgImgListener = new View.OnTouchListener() {
    float x1, x2, y1, y2;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x1 = event.getX();
                y1 = event.getY();
                break;

            case MotionEvent.ACTION_UP:{
                x2 = event.getX();
                y2 = event.getY();
                if (x1 < x2 && Math.abs(y1-y2) < Math.abs(x1-x2) && Math.abs(x1-x2) > swipe_d) {
                    tvText.setText("Swipe Right");
                }
                else if (x1 > x2 && Math.abs(y1-y2) < Math.abs(x1-x2) && Math.abs(x1-x2) > swipe_d) {
                    tvText.setText("Swipe Left");
                }
                else if (y1 < y2 && Math.abs(x1-x2) < Math.abs(y1-y2) && Math.abs(y1-y2) > swipe_d) {
                    tvText.setText("Swipe Down");
                }
                else if (y1 > y2 && Math.abs(x1-x2) < Math.abs(y1-y2) && Math.abs(y1-y2) > swipe_d) {
                    tvText.setText("Swipe Up");
                }
                else if(x1 == x2 && y1 == y2){
                    tvText.setText("Click");
                }
                break;
            }
        }
        return true;
    }
};

(END)

沒有留言:

張貼留言