Scroll(一)滑动效果是如何产生的

滑动一个view,也就是改变其当前所处的位置。它的原理与动画效果非常相似,即通过不断的改变view的坐标来实现。所以要实现view的滑动,就必须监听用户的触摸事件,同时根据事件传入的坐标不断的动态改变view的坐标,从而实现跟随用户触摸的滑动而滑动。

1.Android坐标系

在android中,将屏幕最左上角的定点作为android坐标系的原点,从这个点向右是X正方向,向下是Y正方向。
这里写图片描述
android系统提供了getLocationOnScreen(intlocation[])这样的方法来获取android坐标系中的坐标。另外在触控事件中使用getRawX(),getRawY(),同样也可以获得android坐标系的坐标。

2.视图坐标系

在android中还有另一个坐标系视图坐标系。它描述子视图在父视图中的位置关系,视图坐标系同样以原点向右向下分别为X,Y轴正方向,不同点是视图坐标系的原点不再是屏幕左上角,而是以父视图的左上角为坐标原点。
这里写图片描述
这里是一种相对坐标点,同样在android系统里也提供了响应的方法。在触控事件中,通过getX(),getY() 所获得的坐标就是视图坐标系中的坐标。

3.触控事件–MotionEvent

触控事件即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) {
//        获取X,Y的坐标(视图坐标系)
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
        }
        return true;
    }

上述的代码就是处理触控事件的一个框架,对于不涉及多点操作的情况,完全可以处理。我们需要根据实际业务的需要,在不同的触控事件中编写不同的逻辑。

4.总结

android系统中提供了非常多的方法来获取坐标值,相对距离等。因此我们需要在合适的情况下使用合适的方法。
这些方法可以分为两类:

  1. view提供的获取坐标的方法
    // 获取到的是view自身的坐标到其父布局左边的距离
    getLeft();
    // view到父布局定边的距离
    getTop();
    // view到父布局右边的距离
    getRight();
    // view到父布局底边的距离
    getBottom();

  2. MotionEvent提供的方法
    // 获取点击事件距离控件左边的距离
    getX();
    // 获取点击事件距离控件顶边的距离
    getY();
    // 获取点击事件距离整个屏幕左边的距离
    getRawX();
    // 获取点击事件距离整个屏幕顶边的距离
    getRawY();

这里写图片描述
好了,就先这么多了 高手略过.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值