美文网首页
【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