美文网首页
【Android群英传】——第五章 Android Scroll

【Android群英传】——第五章 Android Scroll

作者: 感同身受_ | 来源:发表于2020-01-29 22:47 被阅读0次

    昨天复习了自定义View,在看到自定义ViewGroup的时候,用到了scrollBy()方法,然后趁着自己还有点印象,今天顺便把滑动机制给复习了,笔记大多在书上,这里只记录代码,源码放在我的GitHub

    获取坐标值的各种方法

    1. View提供的获取坐标的方法(被点击的View的坐标)
      get + Top、Right、Bottom、Left()方法,是得到View到父布局的距离
    2. MotionEvent()提供的方法(点击位置的坐标)
      get + X、Y()方法,是视图坐标
      get + RawX、RawY()方法,是绝对坐标
      【注】绝对坐标使用时,在MotionEvent.ACTION_MOVE时,最后需要多一步lastX = (int) event.getRawX();处理

    实现滑动的七种方法

    前5种方法
    1. layout方法
    //layout方法——视图坐标
        /*
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //记录触摸点坐标
                    lastX = x;
                    lastY = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);
                    break;
            }
    //        return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
            //所以,这里返回true,表示自己能处理这个事件
            return true;
        }*/
    
    //layout方法——绝对坐标
    /*
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            int rawX = (int) event.getRawX();
            int rawY = (int) event.getRawY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //记录触摸点坐标
                    lastX = rawX;
                    lastY = rawY;
                    break;
                case MotionEvent.ACTION_MOVE:
                    int offsetX = rawX - lastX;
                    int offsetY = rawY - lastY;
                    layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    break;
            }
    //        return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
            //所以,这里返回true,表示自己能处理这个事件
            return true;
        }*/
    
    1. offsetLeftAndRight和offsetTopAndBottom方法
    /*@Override
        public boolean onTouchEvent(MotionEvent event) {
            int rawX = (int) event.getRawX();
            int rawY = (int) event.getRawY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //记录触摸点坐标
                    lastX = rawX;
                    lastY = rawY;
                    break;
                case MotionEvent.ACTION_MOVE:
                    int offsetX = rawX - lastX;
                    int offsetY = rawY - lastY;
                    offsetLeftAndRight(offsetX);
                    offsetTopAndBottom(offsetY);
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    break;
            }
    //        return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
            //所以,这里返回true,表示自己能处理这个事件
            return true;
        }*/
    
    1. LayoutParams
    /*@Override
        public boolean onTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //记录触摸点坐标
                    lastX = x;
                    lastY = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    //根据自己布局中的布局类型选择
                    RelativeLayout.LayoutParams layoutParams =
                            (RelativeLayout.LayoutParams) getLayoutParams();
                    layoutParams.leftMargin = getLeft() + offsetX;
                    layoutParams.topMargin = getTop() + offsetY;
                    setLayoutParams(layoutParams);
                    break;
            }
    //        return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
            //所以,这里返回true,表示自己能处理这个事件
            return true;
        }
    */
    
    //ViewGroup.MarginLayoutParams
    /*@Override
        public boolean onTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //记录触摸点坐标
                    lastX = x;
                    lastY = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    ViewGroup.MarginLayoutParams layoutParams =
                            (ViewGroup.MarginLayoutParams) getLayoutParams();
                    layoutParams.leftMargin = getLeft() + offsetX;
                    layoutParams.topMargin = getTop() + offsetY;
                    setLayoutParams(layoutParams);
                    break;
            }
    //        return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
            //所以,这里返回true,表示自己能处理这个事件
            return true;
        }*/
    
    1. scrollBy和scrollTo
    //scrollBy
        /*@Override
        public boolean onTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //记录触摸点坐标
                    lastX = x;
                    lastY = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    ((View)getParent()).scrollBy(-offsetX,-offsetY);
    //                scrollBy(offsetX,offsetY);
                    break;
            }
    //        return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
            //所以,这里返回true,表示自己能处理这个事件
            return true;
        }*/
    
        //scrollTo
        /*@Override
        public boolean onTouchEvent(MotionEvent event) {
            int rawX = (int) event.getRawX();
            int rawY = (int) event.getRawY();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //记录触摸点坐标
                    lastX = rawX;
                    lastY = rawY;
                    break;
                case MotionEvent.ACTION_MOVE:
                    int offsetX = rawX - lastX;
                    int offsetY = rawY - lastY;
                    ((View)getParent()).scrollTo(-offsetX,-offsetY);
                    break;
            }
    //        return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
            //所以,这里返回true,表示自己能处理这个事件
            return true;
        }*/
    
    1. Scroller方法


      Scroller方法
    2. 属性动画
    3. ViewDragHelper


      ViewDragHelper

    源码放在我的GitHub

    相关文章

      网友评论

          本文标题:【Android群英传】——第五章 Android Scroll

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