滑动效果的产生
滑动一个view,本质上就是说移动一个view。改变其当前所处的位置,他的原则与动画效果的实现非常相似,都是通过不断地改变view的坐标来实现这一效果。因此,要实现view滑动,就必须监听用户触摸事件,并根据事件传入的坐标,动态且不断的改变view的坐标,从而实现view的滑动。
先从基本的说起吧。
1.Android坐标系
view滑动需要参考一个标准,在Android中,屏幕的左上角顶点作为原点
而系统提供了
public void getLocationOnScreen(int[] location) {
// TODO Auto-generated method stub
super.getLocationOnScreen(location);
}
这样的方法来获取Android坐标系中的点的位置,就是该视图左上角的坐标。另外在触控事件中使用getRawX(),getRawY()方法获得的坐标同样是Android坐标系中的坐标。
2 视图坐标系
描述了子视图在父视图中的位置关系,他们的作用是相辅相成的,并不矛盾,不过在视图坐标系中的原点是父视图左上角的位置,如上图;
在触控事件中,通过getX(),getY()方法来获得视图中的坐标。
3 触控事件 ——MotionEvent
触控事件在与用户交互的过程中占据很重要的位置,学好这里的知识是掌握滑动的基础,首先咱么先看看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;
通常情况下,我们会在 onTouchEvent(MotionEvent event)方法中通过event.getAction()方法获取触控事件的类型,并使用switch-case方法进行删选,这个代码模式基本固定;
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
//获取当前输入点的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;
case MotionEvent.ACTION_UP:
//处理输入的离开事件
break;
default:
break;
}
return true;
}
在Android中提供了很多的方法来获取坐标值,相对距离等。方法丰富固然好,同样给我们带来了很多困扰,不知道在什么情况下使用它们,下面总结了一些API,结合坐标系咱们来看看;
View提供的获取坐标的方法
getTop();
view自身的顶边到其父布局顶边的距离;
getLeft();
view自身的左边到其父布局左边的距离;
getRight();
view自身的右边到其父布局左边的距离;
getBottom();
view自身的底边到其父布局顶边的距离;
MotionEvent提供的获取坐标系的方法
getX();
获取点击事件距离控件左边的距离,即视图坐标
getY();
获取点击事件距离控件顶边的距离,即视图坐标
getRawX();
获取点击事件距离整个屏幕左边的距离,即绝对坐标
getRawY();
获取点击事件距离整个屏幕顶边的距离,即绝对坐标
相信大家现在对于Android坐标,MotionEvent有了一个比较清楚的认识了,接下来的几章会进入我们的主题——滑动的七种方式。