滑动效果的产生
滑动的本质是移动View,通过不断改变View的坐标实现,与动画的原理类似,不过既然是滑动,就需要监听各种点击,触摸事件
Android坐标系
Android坐标系以屏幕左上角为原点,如图

视图坐标系
子视图以父视图左上角为坐标原点,如图

触控事件中,通过getX(),getY()获得的坐标就是视图中的坐标系
触控事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 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;
public static final int ACTION_HOVER_MOVE = 7;
public static final int ACTION_SCROLL = 8;
public static final int ACTION_HOVER_ENTER = 9;
public static final int ACTION_HOVER_EXIT = 10;
public static final int ACTION_BUTTON_PRESS = 11;
public static final int ACTION_BUTTON_RELEASE = 12;
|
一般在View的onTouchEvent方法中对event.getAction()进行筛选控制,(不涉及多点触控的情况下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: int offsetX = x - lastX; int offsetY = y - lastY; ((View) getParent()).scrollBy(-offsetX, -offsetY); break; case MotionEvent.ACTION_UP: View viewGroup = ((View) getParent()); mScroller.startScroll( viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(), -viewGroup.getScrollY()); invalidate(); break; } return true; }
|
系统提供了很多获取坐标值,相对距离的坐标值的方法,如图

大概分为两类:
View提供的获取坐标的方法
getTop(): 获取到View自身顶边到其父布局顶部的距离
getLeft() : 获取到View自身左边到其父布局左边的距离
getRight():
getBottom();
MotionEvent提供的方法
getX(): 获取点击事件距离控件左边的距离,即视图坐标
getY():获取点击事件距离控件顶部的距离,即视图坐标
getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标
getRawY():….
实现滑动的七种方法
layout方法
本文代表个人观点,内容仅供参考。若有不恰当之处,望不吝赐教!