1.什么是View
在開發過程中,view的使用頻率是非常之高的.那么View到底是什么呢.View其實是android中所有控件的基類.無論是簡單的Button和TextView,還是布局容器linearlayout等等;所以,這個View就是界面層控件的一層抽象.除了View,還有一個ViewGroup類,他也是繼承自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,歡迎大家一起學習-.-~