Android Scroll分析(一)

来源:互联网 发布:广西广电网络收费套餐 编辑:程序博客网 时间:2024/06/09 17:11

1.滑动一个view,实质上就是移动一个view,改变其所处的位置,原理与动画效果的实现非常相似,都是通过不断的改变view的坐标来实现这一效果。所以要实现view的滑动,就必须监听用户的触摸事件,并且根据事件传入的坐标,动态且不断的改变view的坐标,从而实现view随用户的滑动而滑动。

2.Android坐标系

在Android中,将屏幕的最左上角的顶点作为Android坐标系的原点,从这个点向右是X轴的正方向,从这个点向下是Y轴的正方向。如图所示:
Android坐标系

系统提供了 getLocationOnScreen(int location[])这样的方法来获取android坐标系中点的的位置,即该视图左上角在android坐标系中的坐标。另外在触摸事件中使用getRawX(),getRawY()方法获取android坐标系中的坐标。

3.视图坐标系

除了上述所说的坐标系之外,还有一种视图坐标系,它描述了子视图在父视图中的位置关系,这两种坐标系不矛盾也不复杂,他们的作用是相辅相成的。与android坐标系类似,视图坐标系同样是一原点向右是X轴正方向,以原点向下为Y轴正方向,只不过在视图坐标系中,原地单不再是android坐标系中的屏幕最左上角,而是以父视图左上角为坐标原点,如图所示:
视图坐标系

在触摸事件中,通过getY(),getX()所获得的坐标就是视图坐标系中的坐标。

3.触摸事件

触摸事件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; // 多点抬起public static final int ACTION_HOVER_MOVE   = 7;    // 鼠标在view上移动public static final int ACTION_SCROLL  = 8; //非触摸滚动,主要是由鼠标、滚轮、轨迹球触发.........(不一一列举)

通常情况下我们会在

 @Override    public boolean onTouchEvent(MotionEvent event) {        return super.onTouchEvent(event);    }

中通过event.getAction()方法来获取到触摸事件的类型,并且用switch-case方法来进行筛选。

以下是单点触摸事件的模板:

@Override    public boolean onTouchEvent(MotionEvent event) {    // 获取当前输入点的X,Y坐标(视图坐标)        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()) {            case MotionEvent.ACTION_UP:            // 按下                break;            case MotionEvent.ACTION_MOVE:            // 移动                break;            case MotionEvent.ACTION_DOWN:            // 抬起                break;        }        return true;    }

在Android中,系统提供了很多的方法来获取坐标值,相对距离等。下图表示了获取坐标值的各种方法:
获取坐标的各种方法

view提供的获取坐标的方法:

getTop(): 获取到的是view自身的顶边到其父布局顶边的距离;getLeft(): 获取到的是view自身的左边到其父布局左边的距离;getRight():获取到的是view自身的右边到其父布局左边的距离;getBotton():获取到的是view自身的底边到其父布局顶边的距离;

MotionEvent提供的方法:

getX():点击的点距离控件左边的距离,即视图坐标getY():点击的点距离控件顶边的距离,即视图坐标getRawX():点击的点距离整个屏幕左边的距离,即绝对坐标getRawY():点击的点距离整个屏幕顶边的距离,即绝对坐标
0 0