個人讀書筆記,部分沒讀懂的知識點可能會簡單概括或缺失,以后反復閱讀后再完善。
第5章 Android Scroll分析
5.1 滑動效果是如何產(chǎn)生的
5.1.1 Android 坐標系
系統(tǒng)提供了
getLocationOnScreen(intlocation[])
這樣的方法獲取Android坐標系中點的位置。
在觸控事件中使用
getRaw()、getRawY()
方法獲得Android 坐標系的坐標。
5.1.2 視圖坐標系
試圖坐標系描述了子試圖在父試圖中的位置關(guān)系。
在視圖坐標系中,原點不再是Android坐標系中的屏幕最左上角,而是以父試圖坐上角為坐標系原點。
在觸控事件中使用
getX()、getY()
獲取視圖坐標系中的坐標。
坐標系.jpg
5.1.3 觸控事件--MotionEvent
在onTouchEvent(MotionEvent event)方法中通過event.getAction()來獲取觸控事件的類型。
@Override
public boolean onTouchEvent(MotionEvent event) {
//獲取當前輸入點的X、Y坐標(視圖坐標)
int x=(int)event.getX();
int y=(int)event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
}
return true;
}
5.2 實現(xiàn)滑動的七種方法
5.2.1 layout方法
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
int rawX = (int) (event.getRawX());
int rawY = (int) (event.getRawY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
//lastX=rawX;
//lastY=rawY;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = x - lastX;
int offsetY = y - lastY;
//int offsetX = rawX - lastX;
//int offsetY = rawY - lastY;
layout(getLeft() + offsetX,
getTop() + offsetY,
getRight() + offsetX,
getBottom() + offsetY);
/*
* 使用絕對坐標系要記得重新設(shè)置初始坐標
* */
//lastX=rawX;
//lastY=rawY;
break;
}
return true;
}
5.2.2 offsetLeftAndRight()與offsetTopAndBottom()
就算出偏移量后,使用如下代碼。
//同時對left和right進行偏移
offsetLeftAndRight(offsetX);
//同時對top和bottom進行偏移
offsetTopAndBottom(offsetY);
5.2.3 LayoutParams
//動態(tài)修改布局的位置參數(shù)
LinearLayout.LayoutParams layoutParams=
(LinearLayout.LayoutParams) getLayoutParams();
layoutParams.leftMargin=getLeft()+offsetX;
layoutParams.topMargin=getTop()+offsetY;
setLayoutParams(layoutParams);
也可以使用ViewGroup.MarginLayoutParams
//ViewGroup.MarginLayoutParams就不用考慮父布局的類型
ViewGroup.MarginLayoutParams layoutParams1=
(ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.leftMargin=getLeft()+offsetX;
layoutParams.topMargin=getTop()+offsetY;
setLayoutParams(layoutParams);
5.2.4 scrollTo與scrollBy
因為scrollBy方法移動的是View的content,所以應該就View所在的ViewGroup中來使用scrollBy方法。
而設(shè)置scrollBy時存在參考系選擇的問題,所以需要給偏移量加上負號。
((View)getParent()).scrollBy(-offsetX,-offsetY);
5.2.5 Scroller
通過Scroller類可以實現(xiàn)平滑移動的效果,scrollBy是瞬間移動。
case MotionEvent.ACTION_UP:
View viewGroup = ((View) getParent());
mScroller.startScroll(
viewGroup.getScrollX(),
viewGroup.getScrollY(),
-viewGroup.getScrollX(),
-viewGroup.getScrollY()
);
invalidate();
break;
5.2.6 屬性動畫
第7章中講。
5.2.7 ViewDragHelper
ViewDragHelper基本可以實現(xiàn)各種不同的滑動、拖放需求。
演示了一個QQ滑動側(cè)邊欄的布局案例。