View的位置参数及其Scroller类的理解

作者: 蝉翅的空响 | 来源:发表于2017-02-03 16:46 被阅读71次

    Anroid 自定义View View的位置参数


    1.位置参数

    • left = getLeft()
    • right = getRight()
    • top = getTop()
    • bottom = getBottom()

    x和y是View左上角的坐标,translationX和translationY是View左上角相对于容器的偏移量。这几个参数都是相对于父容器的坐标。

    • x = left + translationX getX()
    • y = top + translationY getY()

    getRawX()是相对于手机屏幕的x坐标,同样的,getRawY()是相对于手机屏幕的y坐标。

    2.MotionEvent滑动参数

    • ACTION_DOWM:手指刚接触屏幕。
    • ACTION_MOVE:手指在屏幕上移动。
    • ACTION_UP:手指在屏幕上松开的一瞬间。

    一个点击事件通常是:DOWN->UP
    一个滑动事件通常是:DOWN->MOVE->MOVE->...->MOVE->UP

    3.TouchSlop

    TouchSlop是系统所能识别出的被认为是滑动的最小距离。
    获取这个常量:ViewConfiguration.get(getContext()).getScaledTouchSlop();

    4.Scroller的使用理解

    我们先来看一段套路代码:

        Scroller scroller = new Scroller(getContext());
        //缓慢滚动到制定位置
        private void smoothScrollTo(int destX ,int destY){
            int scrollX = getScrollX();
            int scrollY = getScrollY();
            int deltaX = destX - scrollX;
            int deltaY = destY - scrollY;
            scroller.startScroll(scrollX,scrollX,deltaX,deltaY,1000);
            invalidate();
        }
    
        @Override
        public void computeScroll() {
            if (scroller.computeScrollOffset()){
                scrollTo(scroller.getCurrX(),scroller.getCurrY());
                postInvalidate();
            }
        }
    

    Scroller类其实是一个在自身中存储各种运动参数的类,并没有关于真正滑动的功能,实现滑动的是scrollTo(x,y)可以理解是在他类的内部进行的滑动设想:你现在这个类中给他一个关于滑动的理想轨迹(从一个坐标,到另一个坐标和间隔时间),然后scroller根据这些进行规划(根据时间流逝的百分比算出应该滑动到的坐标),在重绘触发的回调函数computeScroll()中再滑动到置顶的位置scrollTo(scroller.getCurrX(),scroller.getCurrY())。
    总结一下就是,Scroller并不能实现View的滑动,它需要配合View的computeScroll()方法才能实现弹性滑动的效果,它不断让View重绘,而每一次重绘都会导致View进行进行小幅度滑动,而多次小幅度滑动就组成了弹性滑动,这就是Scroller的原理。

    相关文章

      网友评论

        本文标题:View的位置参数及其Scroller类的理解

        本文链接:https://www.haomeiwen.com/subject/qzpdittx.html