View的事件體系----滑動事件

讀書筆記

Android開發藝術探索
[講解的很好](http://gold.xitu.io/post/581ed682128fe1005a064b38)

一、什么是View

1.view是界面層的一種抽象。
2.viewgroup也繼承自view

二、View的位置參數

View主要由四個點來控制位置,最重要的是兩個點:一個是左上定點,一個是右下頂點。View的位置都是相對于父容器來說的,因此是一種相對坐標系。

Paste_Image.png

在Android3.0以后,引入了translationX/Y 偏移量。
x=left+tranlationX;
通常通過getLeft()等方法拿到的值,是view相對于父容器的位置,但是當view發生偏移時,getLeft()等方法是不會變得,改變的是它的偏移量。

三、MotionEvent

手指按下屏幕時,會觸發MotionEvent事件。
點擊事件是down---up
滑動事件是down--move---up
同時通過motionevent可以拿到事件motionEvent事件發生時的坐標點--getX,getY。系統提供了兩種方法getX/Y,getRowX/Y,前者是相對于view初始時的左上頂點的位置的。后者是相對于屏幕的。如上圖。

四、TouchSlop

系統能識別出的最小滑動距離。
即:系統能夠識別出的最小滑動距離。如果小于這個值,系統認為這次事件不是滑動事件。
通過:

ViewConfiguration.get(getContext()).getScaledTouchSlop()方法獲得

五、速度追蹤

VelocityTracker :拿到一次滑動的速度

VelocityTracker velocity=VelocityTracker.obtain();
velocity.addMovement(event);
velocity.computeCurrentVelocity(1000)//時間單位ms
int xVelocity=velocity.getXVelocity();
velocity.clear();
velocity.recycle()

注意
1.在通過get方法拿到速度前,一定要先計算,即調用computeCurrentVelocity方法。
2.從右向左為負值,反之為正值。正負代表方向。
3.不用的時候一定要回收。

GestureDetector

手勢檢測,輔助用戶監聽行為的類

GestureDetector mGesture=new GestureDetector(this);
//解決長按時無法拖動的現象
mGesture.setIsLongpressEnabled(false);

第二步 接管view的ontouch事件

boolean consume=mGesture.onTouchEvent(event);
return consume;

第三部 實現監聽
OnGestureListener 和OnDoubleTapListener (可選)

六、Scroller彈性滑動

使用Scroller和View的computeScroll方法配合完成view有過度的滑動
1.mScroller.startScroll
2.重寫view的computeScroll方法。

//-----------------------------------------------------------------------------------------

View的滑動

1.實現滑動的方式

1.使用View的scrollTo、scrollBy
2.使用動畫
3.使用LayoutParams使得view重新布局

2.使用scrollTo實現

兩個關鍵詞    view邊緣位置:view在布局中的位置
             view內容位置:view中內容的位置(viewgroup也是view);
注意:使用scrollTo只能改變view內容的位置,view本身沒有動。

通過getScrollX/Y 拿到view內容滑動的距離----mScrollX/Y 。它們總是等于view邊緣或者view內容邊緣的水平距離。或者是垂直距離。

方向的正負:

        在水平方向上,參考我們翻書的習慣 :
        1.從右向左為正值
        2.從左向右為負值

        在豎直方向上,同樣參考我們的習慣:
        1.從下往上為正值
        2.從上往下為負值

2.改變布局參數

使用LayoutParams
注意改變時調用requestLayout方法

3.各種滑動的對比
1.ScrollTo適合對內容滑動
2.動畫適合對沒有交互場景的view使用
3.改變布局適合有交互的場景。

彈性滑動

思想:將一次滑動分成多段滑動。

一、使用Scoller
1.創建Scroller對象。
Scroller mScroller=new Scroller(this);
2.滑動到指定的位置
{
 int scrollX=getScrollX();
 int deltaX=destX-scrollX;
 mScroller.startScroll(scrollx,0,deltax,0,1000);
 invalidate();
}
3.重寫computeScroll
@Override
public void computeScroll(){
  if(mScroller.computeScrollOffSet()){
       srcollTo(mScroller.getCurrX,mScroller.getCurrY);
       postInvalidate();
   }
}

computeScrollOffSet會在通過startScroll方法中保存的參數根據時間計算要滑動的距離,它的返回值很重要。true代表滑動沒有結束,false表示結束。

注意
1.startScroll方法并不能執行滑動,它只是保存了要滑動的距離等參數。
2.一點要調用invalidate方法。這樣會時view重新繪制,重新繪制時會調用computeScroll方法。
3.computeScroll是一個空實現,一定要自己具體的實現。
4.computeScroll中通過srcollTo方法實現滑動。
5.scrollTo方法會向Scroll對象拿到當前要滑動的距離,實現一次滑動。
6.接著繼續調用postInvalidate方法再次繪制。重復3,4步驟。

二、使用動畫加控件

1.通過屬性動畫計算在規定時間內每一段要滑動的比例
2.將比例作用于控件上
ValueAnimator animator=ValueAnimator.ofInt(0,1).setDuration(1000);
animator.addUpdateListener(new AnimatorUpdataListener(){
publi void onAnimationUpdate(ValueAnimator animator){
float fraction=animator.getAnimatedFraction();
button.scrollTo((startX+deltaX*fraction),0)
}
})

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

推薦閱讀更多精彩內容