android控件程序员Android技术知识

开发笔记之打造通用下拉刷新(介绍篇)

2016-04-29  本文已影响664人  dzy是个坏人

开发笔记之打造通用下拉刷新(介绍篇)
开发笔记之打造通用下拉刷新(细节篇)
开发笔记之打造通用下拉刷新(重难点篇)

前言

下拉刷新几乎是移动应用最常见的功能了,以前写一些小应用都是直接用别人写的好的库,作为开发者和初学者,我们应该要熟悉每个用过的轮子。安卓平台的下拉刷新,最近了解到比较有名的就是超过4000star 的android-Ultra-Pull-To-Refresh 了。但让人无奈的是,这么优秀的一个库,水平有限的我看源码看得头晕目眩,里面有很多的坐标判断和运算而且没有太多的注释,所以我决定试着自己造一个,于是就有了下面的PullToRefresh(名字比较随意-_-#)

PullToRefresh

源码地址: https://github.com/dzysghr/PullToRefresh
通用的可自定义头部下拉刷新布局,只实现下拉逻辑,不实现下拉头部视觉效果,功能设计参考android-Ultra-Pull-To-Refresh ,但有自己特色和优化,由于用到了ValueAnimaton,最低只能兼容3.0,不断改进中。当然写这个库更多的是出于学习和研究而不是使用的目的

主要功能特性

Demo

功能配置

mPullToRefreshLayout.setRefreshImmediately(boolean b);
mPullToRefreshLayout.setPinHeader(true);
mPullToRefreshLayout.setPinContent(true);
mPullToRefreshLayout.setForceToTopWhenFinish(true);
mPullToRefreshLayout.setCanScrollWhenRefreshing(false);
mPullToRefreshLayout.setUpToRefredshingImmediately(false);
mPullToRefreshLayout.setHasHorizontalChild(true);
mPullToRefreshLayout.setAnimDuration(int animDuration)
mPullToRefreshLayout.setResistance(float resistance)

自定义头部

  1. 继承View or ViewGroup ,并实现HeaderController接口,详见demo
public interface HeaderController
{

    /**
     * 触发刷新的下拉高度,单位px,小于等于你的header高度
     * @return 触发刷新的下拉高度
     */
    int getThresholdHeight();

    /**
     * 正在刷新时的高度,单位px,小于等于你的header高度
     * @return 正在刷新时的高度
     */
    int getRefreshingHeight();

    /**
     * 当header的状态改变时会调用
     *
     * @param state 状态
     */
    void StateChange(HeaderState state);

    /**
     * 开始刷新时被调用,这在个方法实现正在刷新时的动画
     */
    void startRefresh();

    /**
     * 刷新成功时,此方法被调用
     */
    void onSucceedRefresh();

    /**
     * 刷新失败时,此方法被调用
     */
    void onFailRefresh();

    /**
     * 发生拖拽时时此方法会被PullToRefreshLayout调用,可以通过这个偏移量和当前的状态来决定动画的样子
     * @param offset 当头部不固定时表示位置偏移量,当头部内容固定时表示头部露出的高度
     *               范围为下拉时从 0 到 header.getMeasureHeight,上升反之。**/
    void onPositionChange(float offset);

    /** 当 Controller被设置到PullToRefreshLayout时调用
     * @param layout 关联的PullToRefreshLayout
     */
    void attachLayout(PullToRefreshLayout layout);

}
  1. 为PullToRefhreshLayout设置头部
mLayout.setHeader(new CustomHeader(context));

注意事项

    PullToRefreshLayout
         FrameLauout
             ListView

PullToRefreshLayout是无法判断Listview是否滑到顶的,此时需要自己实现何时应该开启下拉

mPullToRefreshLayout.setScrollableListener(new ScrollCondition() {
           @Override
           public boolean canRefresh()
           {
               if(canscroll)
                   return false;
               return true;
           }
       });

后记

其实我个人是不太喜欢看这种瑞士军刀式的控件源码的。因为这个控件的开发往往没有太多面向对象的思想,更多的是坐标运算和判断,由于它要做到功能强大,可配置性强,这样就导致代码里有太多的条件分支,如果做抽象又容易跟进去跟着跟着就不知道自己走到哪了,如果一个大方法写上百行又不可维护,而我们往往只会用到其中的一种功能,从而使很多判断是没必要的,十分影响对源码的理解,所以我的代码里写了很多注释,代码质量有待慢慢提高。
不过造轮子还是有好处的,当我写完这个库时或者写的过程到遇到问题,由于有了整体的思路,这时再去看Ultra Pull To Refresh源码就会感觉逻辑十分清晰,很快就找到关键的代码所在,这样一来既可以更深入地理解别人优秀的代码,又可以知道这个东西的坑在哪里但又不会在坑里困扰太久,这也是造轮子的好处吧。

后续更新中...

上一篇下一篇

猜你喜欢

热点阅读