自定义View之垂直滑动的ViewPager

本文介绍了如何实现一个垂直滑动并带有惯性的ViewPager。通过自定义View,重写onMeasure(), onLayout(), onInterceptTouchEvent()和onTouchEvent()等方法,实现滑动事件处理和子View布局。在过程中,作者遇到了子View高度设置错误和事件分发问题,并给出了相应的解决办法。最后,代码已上传到GitHub供参考。" 120624404,7559581,使用Facets提升机器学习数据集质量,"['数据可视化', '机器学习', '数据预处理', 'Python库', '数据探索']
摘要由CSDN通过智能技术生成

垂直滑动的ViewPager

研究了几天的自定义View,以及对应的事件分发,触摸拦截等,感觉是时候要来一点稍微有点难度的东西了。

实例图:
这里写图片描述

从图中可以看到,我们的View有三个页面,因为为了要显示事件拦截,所以第一个页面添加了一个button按钮。用来展示点击事件。

在实现的过程中踩了很多坑,虽然花费了不少时间,但对View的事件拦截还有测量等有了一个全新的认识。

  • 按照惯例,先上字段图:
/**
     * 屏幕高度
     */
    private int mScreenHeight;

    /**
     * 手指上次触摸事件的y轴位置
     */
    private int mLastY;

    /**
     * 点击时y轴的偏移量
     */
    private int mStart;

    /**
     * 滚动控件
     */
    private Scroller mScroller;

    /**
     * 最小移动距离判定
     */
    private int mTouchSlop;

    /**
     * 滑动结束的偏移量
     */
    private int mEnd;

    /**
     * 初始按下y轴坐标
     */
    private int mDownStartX;

    /**
     * 记录当前y轴坐标
     */
    private int y;
  • 按照定义View习惯,我们首先重写onMeasure()方法
 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int count = getChildCount();

        for (int i = 0; i < count; i++) {
            View childView = getChildAt(i);

            measureChild(childView, widthMeasureSpec, heightMeasureSpec);
        }


       Log.i("info", "onMeasure:"+getMeasuredHeight());
    }

在onMeasure()方法中,我们就干了一件事情,测量childView的宽高。看着没问题,于是我们开心的进入下一步。但此处有大坑
- 重写onLayout()方法。

  @Override
    protected void onLayout(boolean changed, int l, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值