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地址:下載