美文网首页
View滑动的七种方法

View滑动的七种方法

作者: 贝贝beibei96 | 来源:发表于2018-04-23 17:19 被阅读334次

    Android开发避免不了类似于下图的View滑动处理, 所以掌握滑动处理, 是每一个Android developer最base的技能。

    View滑动

    1.layout()

    该方法用于放置View的位置确定View的大小

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // 获取手指x、y坐标
            int x = (int) event.getX();
            int y = (int) event.getY();
            int lastX = 0;
            int lastY = 0;
            
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    lastX = x;
                    lastY = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    // 计算x、y偏移量
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    // 调用layout()方法重新摆放
                    layout(getLeft()+offsetX, getTop()+offsetY, 
                            getRight() + offsetX, getBottom() + offsetY);
                    break;
            }
            return true;
        }
    

    相信很多人对get()和getRaw有疑问, 在这里解释一下:

    // 触摸点相对于其所在组件坐标系的坐标
    event.getX();      
    event.getY();
    
    // 触摸点相对于屏幕默认坐标系的坐标
    event.getRawX();   
    event.getRawY();
    

    还是不明白的话, 看下图:


    坐标系

    再补上一个知识点, onTouchEvent事件return解释:

    public boolean onTouchEvent(MotionEvent event)
    当前的View把事件进行了拦截,则事件则会被传递到该方法中
    
    return false: 
    表明没有消费该事件, 事件将会以冒泡的方式一直被传递到上层的view或Activity中的onTouchEvent事件处理。
    如果最上层的view或Activity中的onTouchEvent还是返回false, 则该事件将消失。
    接下来来的一系列事件都将会直接被上层的onTouchEvent方法捕获。
    
    return true: 
    表明消费了该事件, 事件到此结束。
    
    return super.onTouchEvent(event): 
    默认是fase。
    
    简单的理解就是: 
    如果处理该事件, 则为true, 否则为false。
    

    2.offsetLeftAndRight()与offsetTopAndBottom()

    抵消左和右, 抵消上和下

               case MotionEvent.ACTION_MOVE:
                    // 计算x、y偏移量
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    // 对left和right进行偏移
                    offsetLeftAndRight(offsetX);
                    // 对top和bottom进行偏移
                    offsetTopAndBottom(offsetY);
                    break;
    

    3.LayoutParams(改变布局参数)

    LayoutParams主要保存了View的布局参数, 其中包括位置, 所以可以通过改变布局参数来达到改变位置的效果

               case MotionEvent.ACTION_MOVE:
                    // 计算x、y偏移量
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    // 获取布局参数
                    LayoutParams layoutParams = (LayoutParams) getLayoutParams();
                    // 左边距
                    layoutParams.leftMargin = getLeft() + offsetX;
                    // 上边距
                    layoutParams.topMargin = getTop() + offsetY;
                    setLayoutParams(layoutParams);
                    break;
    

    注意:
    还可以是LinearLayout.LayoutParams、 RelativeLayout.LayoutParams......等等, 因父控件而定, 除此之外还可以使用ViewGroup.MarginLayoutParams来实现

               case MotionEvent.ACTION_MOVE:
                    // 计算x、y偏移量
                    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;
    

    4.动画

    /**
     * @param fx 开始x坐标
     * @param fy 开始y坐标
     * @param tx 目标x坐标
     * @param ty 目标y坐标
     */
    private void setAnim(float fx, float fy, float tx, float ty) {
    
            // 开启硬件加速
            setLayerType(LAYER_TYPE_HARDWARE, null);
            TranslateAnimation translateAnimation = new TranslateAnimation(
                    fx, tx, fy, ty);
            translateAnimation.setDuration(500);
            startAnimation(translateAnimation);
            translateAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
    
                }
    
                @Override
                public void onAnimationEnd(Animation animation) {
                    clearAnimation();
                    // 关闭硬件加速
                    setLayerType(LAYER_TYPE_NONE, null);
                }
    
                @Override
                public void onAnimationRepeat(Animation animation) {
    
                }
            });
        }
    

    5.scollTo()与scollBy()

    这两个方法没有时间写具体的例子测试, 所以不敢随便的写忽悠你们, 这个等后续更新。


    6.Scroller

    这个方法没有时间写具体的例子测试, 所以不敢随便的写忽悠你们, 这个等后续更新。


    7.ViewDragHelper

    这个类非常牛逼, 但我还没有时间写测试, 待更新。




    给大家介绍下, 这是我微信, 欢迎来讨论、 交流技术。

    WeChat

    相关文章

      网友评论

          本文标题:View滑动的七种方法

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