PullToRefresh修改上拉下拉加载动画

修改PullTuRefreshListView源码:
实现 动画加载:

第一步:

源码分析:

PullToRefrehListView 默认加载动画是很难看的:
这里写图片描述

默认是很难看的 但我们想要实现我们的效果怎么办?

分析源码:

找到PullRefreshListView 分析:

我们知道 上拉和下拉加载 动画无非是 pullToRefreshListView 中添加了头和脚, 而头和脚都是动画!!

PullToRefreshListView.java 两个动画类变量:

//定义  头部和尾部的加载动画
    private LoadingLayout mHeaderLoadingView;
    private LoadingLayout mFooterLoadingView;

...

//加载布局
    @Override
    protected LoadingLayoutProxy createLoadingLayoutProxy(final boolean includeStart, final boolean includeEnd) {
        LoadingLayoutProxy proxy = super.createLoadingLayoutProxy(includeStart, includeEnd);
        if (mListViewExtrasEnabled) {
            final Mode mode = getMode();
            if (includeStart && mode.showHeaderLoadingLayout()) {
                //添加  头部动画 到listView中
                proxy.addLayout(mHeaderLoadingView);
            }
            if (includeEnd && mode.showFooterLoadingLayout()) {
                //添加  添加脚部动画  到listView中
                proxy.addLayout(mFooterLoadingView);
            }
        }
        return proxy;
    }
...

createLoadingLayoutProxy方法继承自抽象类PullToRefreshAdapterViewBase查看方法没有该方法继续父类查找,查找PullToRefreshAdapterViewBase父类PullToRefreshBase:


// We need to create now layouts now
        mHeaderLayout = createLoadingLayout(context, Mode.PULL_FROM_START, a);
        mFooterLayout = createLoadingLayout(context, Mode.PULL_FROM_END, a);

...


//加载动画    布局----------
    protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) {
        LoadingLayout layout = mLoadingAnimationStyle.createLoadingLayout(context, mode,
                getPullToRefreshScrollDirection(), attrs);
        layout.setVisibility(View.INVISIBLE);
        return layout;
    }

...

//此处实现了我们需要  修改的动画方法:
//修改代码实现  自己的下载刷新动画
        LoadingLayout createLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) {
            switch (this) {
                case ROTATE://旋转动画
                default:

                //帧动画   frameAnimationLayout为     自定义动画类
                    return new FrameAnimationLayout(context, mode, scrollDirection, attrs);

                //旋转动画   默认的动画
//                  return new RotateLoadingLayout(context, mode, scrollDirection, attrs);


                case FLIP:
                    return new FlipLoadingLayout(context, mode, scrollDirection, attrs);
            }
        }

//自定义动画类 实现动画

package com.handmark.pulltorefresh.library.internal;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.R;

/**
 * Package_name:com.handmark.pulltorefresh.library.internal
 * Author:zhaoQiang
 * Email:zhao_hero@163.com
 * Date:2016/11/28  19:34
 *
 * 帧动画  实现加载自定义的动画   实现的是帧动画
 */
public class FrameAnimationLayout extends LoadingLayout{
//继承自 PullToRefreshListView提供的loadingLayout类

    private AnimationDrawable mAnimationDrawable;

    public FrameAnimationLayout(Context context, PullToRefreshBase.Mode mode,
                                PullToRefreshBase.Orientation scrollDirection, TypedArray attrs) {
        super(context, mode, scrollDirection, attrs);
        mHeaderImage.setImageResource(R.drawable.ptr_animation);
        mAnimationDrawable = (AnimationDrawable) mHeaderImage.getDrawable();
    }

    @Override
    protected int getDefaultDrawableResId() {
    //返回   自定义动画布局
        return R.drawable.ptr_animation;
    }

    @Override
    protected void onLoadingDrawableSet(Drawable imageDrawable) {

    }

    @Override
    protected void onPullImpl(float scaleOfLayout) {

    }

    @Override
    protected void pullToRefreshImpl() {

    }

    //刷新的时候
    @Override
    protected void refreshingImpl() {
        mAnimationDrawable.start();//开启动画
    }

    @Override
    protected void releaseToRefreshImpl() {

    }

    @Override
    protected void resetImpl() {

    }
}

anim.xml:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false"   >

    <item android:drawable="@drawable/ptr_img_0" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_1" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_2" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_3" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_4" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_5" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_6" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_7" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_8" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_9" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_10" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_11" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_12" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_13" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_14" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_15" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_16" android:duration="10"></item>
    <item android:drawable="@drawable/ptr_img_17" android:duration="10"></item>


</animation-list>

这就完成了自定义下拉和上拉动画,修改部分源码以及自定义帧动画类,效果图:这里写图片描述

源码:
https://github.com/zqHero/PullToRefreshDemo

参考博客:

http://blog.csdn.net/plmmmmlq/article/details/50068717

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值