2018.11.26至2018.11.30周技术学习总结(重点复习自定义控件)

本周重点复习

案例来源尚硅谷的仿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的分发是一个循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值