垂直滑动的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,