View的基礎知識

1.什么是View

在開發過程中,view的使用頻率是非常之高的.那么View到底是什么呢.View其實是android中所有控件的基類.無論是簡單的Button和TextView,還是布局容器linearlayout等等;所以,這個View就是界面層控件的一層抽象.除了View,還有一個ViewGroup類,他也是繼承自View,但是從名字上就可以看出,它是一個View組,可以包含多個View.如此設計,便可以得到一個樹形結構.

view結構

2.View的位置參數

View的位置是由四個頂點決定的,分別對應top,left,right和bottom.需要注意的是這些數值都是相對于*** 父控件 ***來說的.
//一般要獲取View的大小可以這樣

viewWidth = view.getRight() - view.getLeft();

viewHeight = view.getBottom - view.getTop();

到了android3.0的時候,google又增加了額外的幾個參數:x,y,translationX和translationY. x,y表示的是左上角點的坐標.translationX和translationY的默認值都是0.

x = left + translationX;

y = right + translationY;

需要強調的是:在View平移的過程中,top和left表示的是原始的左上角的位置信息,是不會發生改變的.發生改變的是x,y,translationX和translationY.

3.MotionEvent和TouchSlop

1.MotionEvent-手勢事件 主要包括以下幾個類型:
ACTION_DOWN:手指剛剛接觸屏幕
ACTION_UP:手指松開的一瞬間
ACTION_MOVE:手指在屏幕上移動
對于這些事件發生的位置可以提供以下幾個方法獲取位置:
//相對于所在當前view的x,y坐標

x = motionEvent.getX();

y = motionEvent.getY();

//相對于屏幕所在位置

rawX = motionEvent.getRawX();

rawY = motionEvent.getRawY();

2.TouchSlop 它是一個常量,是系統所能識別的滑動的最小距離.換句話說,如果你移動的距離小于這個常量,系統就不會認為你這是一次滑動事件.
//可以通過以下方法獲取這個常量 系統版本不一樣 數值不一樣的

ViewConfiguration.get(getContext()).getScaledTouchSlop();

4.VelocityTracker,GestureDetector和Scroller

1.VelocityTracker 主要是用來追蹤手指的移動速度,包括水平速度和垂直速度. 使用方法:在View的onTouchEvent()中追蹤速度

VelocityTracker tracker = VelocityTracker.obtain();

tracker.addMovement(event);

獲取速度的時候這樣做:
//設置計算速度的時段的大小 單位是ms

//這一步必須在下面方法的前面 不然報錯喲

tracker.computerCurrentVelocity(1000);

//速度單位是 px/ms

//速度值可能是負的

int velocityX = (int) tracker.getXVelocity();

int velocityY = (int) tracker.getYVelocity();

實際上速度是這樣計算的
速度 = (結束位置 - 開始位置) / 時間;

在不需要的時要clear掉VelocityTracker

tracker.clear();

tracker.recycle();

2.GestureDetector-手勢檢測 用于輔助檢測用戶的單擊,滑動,長按,雙擊等等行為. 首先,創建一個GestureDetector對象并實現onGestureListener()接口,根據需要還可以onDoubleTapListener()實現雙擊事件.

GestureDetector detector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

 @Override

 public boolean onDown(MotionEvent e) {

 //手指觸摸屏幕的瞬間 一個ACTION_DOWN發生

 return false;

 }

 @Override

 public void onShowPress(MotionEvent e) {

 //手指觸摸屏幕 尚未松開 強調的是沒有松開或者拖動的事件

 //有一個ACTION_DOWN觸發

 }

 @Override

 public boolean onSingleTapUp(MotionEvent e) {

 //手指觸摸后松開 有一個ACTION_UP發生

 //是單擊行為

return false;

 }

 @Override

 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

 //手指按下屏幕并且拖動

 //由一個ACTION_DOWN和多個ACTION_UP觸發 是拖動行為

 return false;

}

 @Override

 public void onLongPress(MotionEvent e) {

 //用戶長時間按住屏幕不放 這是長按事件

 }

 @Override

 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

 //按下屏幕 快速滑動 然后又松開

 //由一個ACTION_DOWN,多個ACTION_MOVE和一個ACTION_UP觸發

 //這是快速滑動行為

 return false;

 }

 });

 detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {

 @Override

 public boolean onSingleTapConfirmed(MotionEvent e) {

 //這是嚴格的單擊行為

 //若是觸發了onSingleTapConfirmed(),則不可能后面還發生單擊,這也就是保證了這就單擊 不可能是雙擊中的一次單擊

 return false;

 }

 @Override

 public boolean onDoubleTap(MotionEvent e) {

 //雙擊 由兩次單擊事件發生

 return false;

 }

 @Override

 public boolean onDoubleTapEvent(MotionEvent e) {

 //雙擊事件發生期間會隨著    ACTION_DOWN,ACTION_UP,ACTON_MOVE多次調用

 return false;

 }

 });

接著,接管目標View的onTouchEvent方法,在待監聽View的onTouchEvent()方法中添加如下實現:
return decevtor.onTouchEvent(event);

3.Scroll
彈性滑動對象,用于實現控件的彈性滑動.當使用View的scrollTo/scrollBy方法來進行滑動.
scrollTo是絕對滑動
scrollBy是相對當前位置的滑動.

附錄

以后每個知識點的實踐學習代碼會上傳到我的GitHub,歡迎大家一起學習-.-~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容