android群英传笔记啊 android滑动的一些知识

android scroll

1.滑动的产生:监听用户用户触摸事件,并根据事件传入坐标,通过不断改变view的坐标,实现view跟随用户触摸的滑动而滑动。

1.1 android坐标系:屏幕左上角的顶点为坐标系的原点,这个点向右为x正轴,这个点向下为y轴正轴。

1.2 视图坐标系:和android坐标系x.y一样,只是坐标原点变成了父控件的左上角。

   private void getxy(MotionEvent event) {
//        view提供的
        View view = new View(BaseApplication.getContext());
        float top = view.getTop(); //获取到view自身的顶边到其父布局顶边的距离
        float left = view.getLeft();
        int right = view.getRight();
        int bottom = view.getBottom();

//        MotionEvent提供的方法
        //        获取点击事件距离控件左边的距离,视图坐标
        int x = (int) event.getX();
        int y = (int) event.getY();
//        获取点击事件距离整个屏幕左边的距离,即绝对坐标
        float rawX = event.getRawX();
//        获取点击事件距离整个屏幕顶边的距离,即绝对坐标
        float rawY = event.getRawY();

    }

1.3触控事件 MotionEvent

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
//            单点触摸按下动作
                break;
            case MotionEvent.ACTION_UP:
//                单点触摸离开动作
                break;
            case MotionEvent.ACTION_MOVE:
//                触摸点移动事件
                break;
            case MotionEvent.ACTION_CANCEL:
//                触摸动作取消
                break;
            case MotionEvent.ACTION_OUTSIDE:
//                触摸动作超出边界
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
//               多点触摸按下动作
                break;
            case MotionEvent.ACTION_POINTER_UP:
//                多点离开动作
                break;
        }
        return super.onTouchEvent(event);
    }

2.实现滑动的七种方法

2.1 重写view在onTouchEvent中通过 layout方法设置

    int lastX ;
    int lastY ;
    @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 true;
    }
2.2 计算出偏移量了后,通过offsetLeftAndRight()和offsetTopAndBottom()来设置

    int lastX ;
    int lastY ;
    @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);
                offsetLeftAndRight(offsetX);
                offsetTopAndBottom(offsetY);
                break;
        }
        return true;
    }
2.3 通过修改LayoutParams来动态修改一个布局的位置参数。

    int lastX ;
    int lastY ;
    @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);
//                offsetLeftAndRight(offsetX);
//                offsetTopAndBottom(offsetY);
                ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
                layoutParams.leftMargin = getLeft()+offsetX;
                layoutParams.topMargin=getTop()+offsetY;
                setLayoutParams(layoutParams);
                break;
        }
        return true;
    }
2.4通过scrollTo和scrollBy,注意这两个移动的是他里面的内容.如果只是一个view移动的是view的内容,如果是一个viewgroup移动的就是它里面的view

    int lastX ;
    int lastY ;
    @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;
//                scrollTo(offsetX,offsetY);
//                获取到它的父控件调用scrollTo,另外注意这里设置的是负值
                ((View) getParent()).scrollTo(-offsetX,-offsetY);
                break;
        }
        return true;
    }
2.5 通过用Scroller类 实现平滑移动

在构造方法中实例化一个Scroller

   @Override
    public void computeScroll() {
        super.computeScroll();
//        判断scroller是否执行完毕
        if (scroller.computeScrollOffset()) {
            ((View)getParent()).scrollTo(
            scroller.getCurrX(),
            scroller.getCurrY());
//            通过重回来不断调用computeScroll
            invalidate();
        }
    }

    int lastX;
    int lastY;

    @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;
//                scrollTo(offsetX,offsetY);
//                获取到它的父控件调用scrollTo
                ((View) getParent()).scrollTo(-offsetX, -offsetY);
                break;
            case MotionEvent.ACTION_UP:
//                手指离开时执行滑动过程
                View viewGroup = (View) getParent();
                scroller.startScroll(viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(), -viewGroup.getScrollY());
                invalidate();
                break;
        }
        return true;
    }
2.6 通过属性动画

2.7 通过ViewDragHelper







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值