讀書筆記
Android開發藝術探索
[講解的很好](http://gold.xitu.io/post/581ed682128fe1005a064b38)
一、什么是View
1.view是界面層的一種抽象。
2.viewgroup也繼承自view
二、View的位置參數
View主要由四個點來控制位置,最重要的是兩個點:一個是左上定點,一個是右下頂點。View的位置都是相對于父容器來說的,因此是一種相對坐標系。
在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)
}
})