本周重点复习
案例来源尚硅谷的仿ViewPager
1.ViewGroup
onLayout是抽象的
ViewGroup中的onLayout是一定要实现的,便利孩子,给每个孩子指定了在屏幕的位置。
for(int i=0;i<getChildCount();i++){
View childView = getChildAt(i);
childView .layout(i*getWidth(),0,(i+1)*getWidth(),getHeight());
}
3,自定义滑动
手势识别
a。定义出来
b。实例化-把想要的方法重新定义出来
c。在onTouchEvent()把事件传递给手势识别器GestureDetector
4.onScroll有一个内部方法,让内部的孩子发生移动 srollBy(distanceX,distanceY)
scrollTo(mScrollX+x,mScollY+y) mScrollX为起始值,x为移动距离
瞬间复原scrollTo 平滑复原view.reset()
5.坐标一般用float
if(startX-endX>getWidth()/2){
//滑动时显示下一个页面
tempIndex++;//下标位置
}else if(endX-startX>getWidth()/2){
//滑动时显示上一个页面
tempIndex--;
}
6.平滑复原的另一种方法
创建Scroll类,将scrollTo方法分成多个小段,让回弹平滑
求一小段的距离,求一小段的坐标,求一小段的时间,
SystemClock.uptimeMillis();系统开机时间
系统同样有ScollTo的类
7.添加RadioGroup实现页面切换
a。布局文件加RadioGroup
b。实例化,根据页面多少自动添加RadioButton
c。定义接口PageChangeListener
d。使用接口
e。监听RadioButton点击
f。使用系统Scoller的startScroll方法,方法中有时间参数,不重写这个参数时默认是250
8.点击事件
a。定义接口,让使用者传递接口实例进来。
b。调用方法
c。用户使用
d。回调
9.为什么子视图无法显示?
因为没有测量
为什么没有测量,其他页面又能显示?
测量的目的是根据测量结果保存位置,虽然没有测量,但给MyViewPager的一级子View人为指定了位置onLayout,新添加的页面中的二级子View需要测量。
10、测量不会一次完成,而是要测量多次
11.WidthMeasureSpec父层视图给当前视图的宽和模式
ATMOST 父容器指定了大小,子View不能大于
UNSPECTFIED 父容器不对View有任何限制
EXACTIY 父容器已经测量出子View的大小
getMode()
getSize()
makeMeasureSpec() 给下一层视图一个测量值
12.事件冲突和事件分发
(1) dispatchTouchEvent事件分发,所有事件必须经过 ViewGroup的事件传递消费
(2)onInterceptTouchEvent是ViewGroup中才有的,负责事件拦截,true拦截,传给当前控件的onTouchEvent,false为不拦截,事件继续传递给孩子
(3)onTouchEvent用于事件处理
在本案例中,
左右滑>上下滑,拦截
左右滑<上下滑,不拦截
a。记录坐标
b。记录结束值
c。计算绝对值(Math.abs(end-start))
13,事件传递分析
什么也不做时,层层传递,再层层回传
Activity dispatchTouchEvent->ActionDown
Father dispatchTouchEvent->ActionDown
Father onInterceptTouchEvent->ActionDown
Childs dispatchTouchEvent->ActionDown
Childs onInterceptTouchEvent->ActionDown
Childs onTouchEvent->ActionDown
Father onTouchEvent->ActionDown
Activity onTouchEvent->ActionDown
Activity dispatchTouchEvent->ActionDown
Activity onTouchEvent->ActionDown
当Childs的onTouchEvent()返回true时代表消费事件
Activity dispatchTouchEvent->ActionDown
Father dispatchTouchEvent->ActionDown
Father onInterceptTouchEvent->ActionDown
Childs dispatchTouchEvent->ActionDown
Childs onInterceptTouchEvent->ActionDown
Childs onTouchEvent->ActionDown
Activity dispatchTouchEvent->ActionUp
Father dispatchTouchEvent->ActionUp
Father onInterceptTouchEvent->ActionUp
Childs dispatchTouchEvent->ActionUp
Childs onTouchEvent->ActionUp
当Childs的onTouchEvent()返回true时并且执行super.onTouchEvent()事件的传递
Activity dispatchTouchEvent->ActionDown
Father dispatchTouchEvent->ActionDown
Father onInterceptTouchEvent->ActionDown
Childs dispatchTouchEvent->ActionDown
Childs onInterceptTouchEvent->ActionDown
Childs onTouchEvent->ActionDown
Activity dispatchTouchEvent->ActionUp
Father dispatchTouchEvent->ActionUp
Father onInterceptTouchEvent->ActionUp
Childs dispatchTouchEvent->ActionUp
Childs onTouchEvent->ActionUp
事件ActionMove的分发是一个循环