Android Scroll分析(一)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值