滑动是实现绚丽的自定义控件的基础。
- 基础知识
- 弹性滑动
- 滑动冲突
一 基础知识
MotionEvent
事件类型
- ACTION_DOWN:手指刚接触屏幕
- ACTION_MOVE:手指在屏幕上移动
- ACTION_UP:手指从屏幕上松开的一瞬间
getX/getY:相对于当前View左上角的坐标
getRawX/getRawY:相对于手机屏幕左上角的坐标
TouchSlop
系统所能识别的滑动最小距离。常量值,与设备有关。
ViewConfiguration.get(getContext()).getScaledTouchSlop()
VelocityTracker
速度追踪,手指在滑动过程中的速度(一段时间内手指滑过的像素数)。
// onTouchEvent方法中使用
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
// 滑动速度
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
// 重置回收
velocityTracker.clear();
velocityTracker.recycle();
二 弹性滑动
Scroller|OverScroller
实现View的平滑移动。
Scroller scroller = new Scroller(mContext);
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());// 设置当前的滚动位置
postInvalidate();
}
}
三 滑动冲突
场景:
- 内外滑动方向不一致
- 内外滑动方向一致
- 互相嵌套