从下拉刷新中学习android坐标系和自定义view

       android下拉刷新,是用处很多的一个功能,里面包含了很多关于view的内容,所以要学学android自定义view的同学,不妨找个下拉刷新来练练手。

    下拉刷新原理

我们先概况的说一下下拉刷新的几个步骤,

1、把整个页面分为下拉头和内容布局两部分;

2、在界面初始化布局的时候需要把下拉头通过scrollTo滚动出屏幕可见区;

3、重写onInterceptTouchEvent,检测当内容布局滑动到顶端的时候,return true,拦截手势,交由onTouchEvent处理;

4、在onTouchEvent中,通过scrollBy,按照手势滑动的距离乘以一个小于1的速率,实现“艰难下拉”的效果;

5、手势抬起时候,判断是否达到下拉刷新的要求,达到的话,把刷新事件通过接口抛出去,否则,通过startScroll把下拉头滚回去;

根据上面的步骤,我们详细说一下整个下拉刷新的要点;

      1、页面布局初始化和坐标系

首先,一开始下拉头是隐藏的,如图蓝色部分,内容部分为显示的内容区,可以为listview等

我们尝试自定义一个view继承自LinearLayout,然后自定义一个下拉头的xml布局,在构造函数中,通过addview,把下拉头添加到自定义view的头部。

重写onLayout测量函数,通过scrollTo(0,headViewHeight),把头部隐藏起来;

补充一下Android 的坐标系

(1)、首先,我们明白Android的坐标系统,屏幕的左上角是坐标系统的原点(0,0),原点向右是X轴的正方向,向下是Y轴的正方向;

(2)、关于Scroll的概念,因为Scroll的存在的意义是屏幕容纳不下当前View,需要通过滚动把屏幕之外的显示出来;

       (2.1)、我们想象,屏幕之外是一块无限大的画布,画布上是我们的view(父视图),我们通过Scroll滚动,实际上是在该画布上滚动,作用是把画布上的view(父视图)显示到屏幕上;

         (2.2)、由于上诉的理论,所以getScrollY(),就是画布上的view(左上角)相对于屏幕的偏移量(getScrollX如此);

        (2.3)、view.scrollTo(x,y)时,将画布上的view左上角定义为(0,0),然后移动屏幕左上角到view的(x,y)处,x和y是view(父视图)决定的

          (2.4)、event.getX()和event.getY()相对于view(父视图)(0,0)的坐标值;

          (2.5)、Scroller.startScroll(int startX,int startY,int dx,int dy),其中startX 和 startY也是相对于view(父视图)的原点的距离

      2、滑动事件拦截

   (1)、首先,我们明白大概了解dispatchTouchEvent 和onInterceptTouchEvent和onTouchEvent的联系,当我们按下屏幕DOWN时,dispatchTouchEvent ()就被启动了,这个方法通过onInterceptTouchEvent来判断,本次的view是否被拦截,如果被拦截,在onTouchEventzhong ,这个ACTION_DOWN只会在本层相应,然后消费掉,进而执行ACTION_MOVE,ACTION_UP等操作;

    (2)、针对下拉刷新的需求,我们手指在内容区域滑动时,此时,滑动事件应该交由内容区域接管消费;当我们把内容区域滑动到顶部时,就应该把滑动事件拦截下来,交由父视图消费,在onTouchEvent中;

      3、滚动API的理解

    (1)、scrollTo(x,y)和scrollBy(x,y),前者是以父视图原点(0,0)为基准,把屏幕的原点滑动到父视图的(x,y)坐标处;后者是一个增量滚动,即这次滚动的(x,y),是以上一次的(x1,y1)作为基准点,其实内部scrollBy也是调用了scrollTo,然后做增量处理;

    (2)、Scroller.startScroll(int startX,int startY,int dx,int dy) 和computeScroll回调,这两个其实是一对出现的,当我们调用了startScroll,相当于给Scroller一个初始化,然后调用invalidate()刷新,此时系统会回调computeScroll,在里面执行真正的滚动scrollTo,再调用invalidate(),形成了一个循环,当Scroller.computeScrollOffset()返回true时,结束此次滚动。

 

总结:上诉步骤是实现下拉刷新的一种方式,当然我们也可以使用其他方式实现,例如不适用Scroller,而是通过修改view的margin值,也可以实现,但是经验告诉我们,Scroller可以更流畅的把效果展示出来

             原理的阐述则是针对下拉刷新过程的一些原理剖析,设计到这个view的原理,可以好好的理解下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值