Android Scroll 分析
5.1.1 Android的坐标系 如何获取Android坐标系点的位置?
通过系统提供的getLocationOnScreen(int location[]);5.1.2 getX()、getY()、getRawX()、getRawY()
getRawX()、getRawY()主要是获取在android坐标系的坐标 getX()、getY()主要是获取在视图坐标系的坐标5.1.3 触控事件–MotionEvent
(1) MotionEvent 中封装的一些常用的时间常量
// 单点触摸按下动作
public static final int ACTION_DOWN = 0;
// 单点触摸离开动作
public static final int ACTION_UP = 1;
// 触摸点移动动作
public static final int ACTION_MOVE = 2;
// 触摸动作取消
public static final int ACTION_CANCEL = 3;
// 触摸动作超出边界
public static final int ACTION_OUTSIDE = 4;
// 多点触摸按下动作
public static final int ACTION_POINTER_DOWN = 5;
// 多点离开动作
public static final int ACTION_POINTER_UP = 6;
(2) 一般情况下在onTouchEvent(MotionEvent e)的固定模板
public boolean onTouchEvent(MotionEvent e){
int x = (int)e.getX();
int y = (int)e.getY();
switch(e.getAction()){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
(3) View 提供的 getTop()、getBottom、getLeft()、getRight()
这些方法表示的含义:该View到父View的上下左右的距离
5.2 实现滑动的七种方法
第一种:通过调用layout方法
其中书中有俩个例子,刚开始没敲代码时看的不是很明白后来发现使用getRawX()、getRawY()需要每次MOVE的时候进行初始化而在使用 getX()、getY()确不需要是因为getX()和getY()的坐标系也是在随着滑动在改变,然而getRawX()和getRawY()的坐标系是固定的。第二种:通过offsetLeftAndRight(offsetX)与offsetTopAndBottom(offsetY)
其中offsetX和offsetY分别是左右和上下的偏移量第三种:通过LayoutParams布局参数
其中我们需要主要的是如果该View的父View是哪个ViewGroup,那我们的LayoutParams就对应着父View的LayoutParams
比如我们的父View是LinearLayout那么我们的LayoutParams就是LinearLayout.LayoutParams。
获取LayoutParams对象:通过getLayoutParams()方法
示例:
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)getLayoutParams();
params.leftMargin = getLeft() + offsetX;
params.topMargin = getTop() +offsetY;
setLayoutParams(params);第四种:通过ScrollTo()和ScrollBy() 我们需要注意的是这个移动的参照物是画布,移动的是手机屏幕,即屏幕在画布上移动。所以在我们使用这俩个方法的时候发现手指移动,方块移动的方向是相反的。结局办法就是 设置成相反值。
第五种:通过Scroller
由于通过ScrollTo()和ScrollBy()这些方法使View移动是瞬间的,没有什么过渡效果,给人一种很突兀的感觉。
然而Scroller就可以实现平滑的移动。
使用示例:
重写computeScroll()
public void computeScroll(){
super.computeScroll();
// 判断Scroller是否执行完毕
if(mScroller.computeScrollOffset()){
((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
invalidate();
}
}
在我们需要使用平滑移动的事件中使用Scrller类的startScroll()开启平滑移动过程。
public void startScroll(int StartX, int StartY, int dx, int dy, int duration);
public void startScroll(int StartX, int StartY, int dx, int dy);
case MotionEvent.ACTION_UP:
View viewGroup = (View)getParent();
mScroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-offsetX,-offsetY);
invalidate();
break;第六种:属性动画
第七种:通过ViewDragHelper