美文网首页
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滑动的七种方法

    Android开发避免不了类似于下图的View滑动处理, 所以掌握滑动处理, 是每一个Android develo...

  • 弹性滑动典型代码

    弹性滑动对象,用于实现View的弹性滑动。当使用View的scrollTo/scrollBy方法进行滑动时,其过程...

  • View滑动的六种方法

    view滑动方法1:通过layout重新设置左上右下参数,刷新界面 view滑动方法2:offsetLeftAnd...

  • Android View的滑动详解

    View的滑动 View的滑动主要有三种方式: 通过view本身提供的scrollTo/scrollBy方法来实现...

  • Android 开发艺术探索笔记(九) 之 View 的滑动

    View 的滑动主要有 3 种方式: 1.通过 View 本身的 scrollTo/scrollBy 方法实现滑动...

  • View的滑动

    常见的View滑动方式: 通过View本身提供的scrollTo/scrollBy方法实现滑动 通过动画实现Vie...

  • 实现View滑动的七种方法

    Android坐标系 在介绍如何实现View滑动之前先了解一下Android的坐标系,我们在初中数学就学过坐标系,...

  • Android滑动的实现

    坐标系 android 坐标系 View坐标系getX() getY(); 滑动的七种实现 1. layout 2...

  • View滑动

    通过三种方式可以实现View的滑动: 通过View本身提供的scrollTo/scrollBy方法来实现滑动操作简...

  • Android View的滑动和滑动冲突

    一、View的滑动 可以通过三种方式实现滑动。 通过View本身提供的scrollTo和scrollBy方法来实现...

网友评论

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

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