Android學習筆記-View的位置參數以及手勢的監聽

View的位置參數這個在平常經常會用到,一些比較炫的動畫,還有效果,都是改變View的位置來進行的。在有一個是手勢的監聽,監聽手指在屏幕上的滾動,快速滑動等。

View的位置參數

1.view的位置主要由它的四個頂點來決定的,分別對應於view的四個屬性,left,top,right,bottom.

  • left:爲view左上角的橫座標
  • top:爲view左上角縱座標
  • right爲view右下角的橫座標
  • bottom爲右下角的縱座標

這些座標都是相對於view的父容器而言的

2.從android3.0開始,view增加了幾個額外參數,x,y,translatonX,translationY.

  • x: view左上角的橫座標
  • y: view左上角的縱座標 (相對父容器的位置)
  • translationX,translationY 偏移值

上面這倆個值默認的初始值爲0,只有在動畫移動的過程中,其值會發生改變,值爲動畫移動的距離,後面有一個demo來驗證

滿足關係: x = left + translationX;

這裏寫圖片描述

上面這張圖應該能夠很好地說明他們之間的關係(作圖不易啊)


2.手勢監聽

手勢監聽,用於輔助檢測用戶的單擊,滑動,長按,雙擊等行爲,下面說下如何給View增加手勢的監聽

1. 給customView設置觸摸的事件,這樣view纔會收到我們的註冊事件

customView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {


            return false;
        }
    });

2.實現GestureListener,用於當觸摸屏幕時回調

class MyGestureListener implements GestureDetector.OnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        System.out.println("onDown");
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        System.out.println("手指被輕輕按下");
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {

        System.out.println("單機一次");
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        System.out.println("手指在屏幕上滾動");
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        System.out.println("手指在屏幕上長按");
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        System.out.println("手指在屏幕上快速滑動");
        return false;
    }
}

3.CustomView類中創建一個GestureDetector對象

gestureDetector = new GestureDetector(context, new MyGestureListener(), null);

4.讓GestureDetector接管觸摸的事件

  @Override
public boolean onTouchEvent(MotionEvent event) {

    //手勢監聽的返回值爲false,由於我們在重寫手勢監聽的listener的都返回爲flase,在該方法
    //最後返回ture,是因爲我們已經把事件的處理交給手勢監聽了,如果返回false,則view自己還得處理一次
    //當值爲false,有些滾動,快速滑動的事件就會檢測不到了
    boolean resume = gestureDetector.onTouchEvent(event);

    return true;
}

這樣大工就告成了。

Demo地址:下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章