Android滑动学习整理

坐标系

绝对坐标

参考系是屏幕,屏幕最左上角就是原点,右是x轴的正方向,下是y轴的正方向,可以调用getLocationOnScreen(int location[])来获取位置,在触控事件中通过getRawX(),getRawY()来获取x,y的坐标是绝对坐标

相对坐标

参考系是父类控件,原点是父控件的左上角,在触控事件中通过getX(),getY()获取的是相对坐标

获取坐标方法

View本身提供的方法
getTop(),getLeft(),getRight(),getBottom()都是获取自身到父控件的距离

触控事件提供的方法
getRawX(),getRawY()获取x,y的坐标是绝对坐标
getX(),getY()获取的是相对坐标

这里提一下触控事件就是 MotionEvent,在onTouchEvent中通过调用event.getAction就可以获取到触控事件的类型,从而进行相关操作。

实现滑动的方法

实现滑动有很多中方法,这里主要介绍几种常用的,实现滑动常常在自定义控件中用到,比如想要实现一个自定义抽屉布局,那么就需要实现这个控件的滑动效果。

scrollTo & scrollBy

顾名思义,scrollTo就是移动到,scrollBy就是移动多少,传入的数值一个是坐标,一个是移动的距离,不过需要注意这两种都是移动的与坐标系反方向的数值,比如你想往右下移动,那么传入的数值两个都是负数,这里做一个简单的示意图
在这里插入图片描述

ViewGroup相当于屏幕,就是可视区域,后面的content就是画布,内容。只有视图中的内容是可见的,其他都不可见,调用滑动后滑动的是ViewGroup而不是content,比如传入正值,右下滑动。那么就会出现下面的结果
在这里插入图片描述

button在content中的位置并没有变化但在viewGroup中的位置却往左上了,这就不是想要的结果,所以并须是想移动方向的赋值

同时需要注意的一点的是两个方法都是移动的viewGroup内部的内容,比如TextView中的文字,所以要移动子view就要移动它的父控件
((View)getParent()).scrollBy(x,y);

Scroller

Scroller只是个计算器,提供插值计算,让滚动过程具有动画属性,但它并不是UI,也不是辅助UI滑动,反而是单纯地为滑动提供计算

ScrollTo和ScrollBy都是瞬间移动,没有平滑的移动效果,如果想有这种效果,就要采用Scroller,它是一种具有延时效应的滑动,即手指移动过后,动画效果才会出来,不会立刻跟着手指移动,这种移动常用在滑动后返回原来位置的动画。比如想做一个滑动距离如果小于一个值,就判断用户没有想做这个动作,让按钮回到原来的位置,如果超过某个值,再触发新的动画。

实现Scroller需要重写computeScroll()方法,系统在绘制View的时候会在draw()方法中调用该方法,该方法实际就是调用的scrollTo方法,想要实现平滑的滑动效果就需要不断的使用scrollTo方法,所以需要在代码中通过不断重绘来调用computeScroll。

    @Override
    public void computeScroll() {
        super.computeScroll();
        //判断Scroller是否执行完毕
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            //通过重绘来不断调用computeScroll
           invalidate();
           // invalidate()→draw()→computeScroll(),当模拟过程结束后,Scroller.computeScrollOffset会返回false,从而中断循环
        }
    }

接着就要调用在合适的地方调用startScroll方法,比如要实现松开手指后回到原点的操作,那么就需要在触碰事件中的MotionEvent.ACTION_UP中调用startScroll();
startScroll(startX, startY, dx, dy, DEFAULT_DURATION);
startX 水平方向滚动的偏移值,以像素为单位。正值表明滚动将向左滚动
startY 垂直方向滚动的偏移值,以像素为单位。正值表明滚动将向上滚动
dx 水平方向滑动的距离,正值会使滚动向左滚动
dy 垂直方向滑动的距离,正值会使滚动向上滚动
那么要实现这个效果传入的参数就是viewGroup.getScrollX(),viewGroup.getScrollY(),-viewGroup.getScrollX(),-viewGroup.getScrollY()
前两个参数是滚动的距离,即松开手指的位置,后两个参数就是反方向滚动相同的距离,这样就实现了这个效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值