SmartRefreshLayout自定义上拉刷新效果--官网方法的实践

SmartRefreshLayout官网:

https://github.com/scwang90/SmartRefreshLayout

日常使用方式以及注意事项:

https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_property.md

https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_faq.md

自定义header:

https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_custom.md

我们利用这个控件自定出来的下拉刷新效果如图所示:其中的动画使用的是Lottie文件

 

本例中的自定义header基本和官网上的例子没有什么区别,写全各种回调,只是header的动画是用的Lottie动画,全部代码如下所示:

public class EntrancePageRecyclerViewHeader extends LinearLayout implements RefreshHeader {
    Activity mAct;
    private LottieAnimationView mLottieAnimationView;
    private boolean mHasInit = false;
    private MainPageCtrl mainPageCtrl;

    private RefreshKernel kernel;

    private int mDesColor;

    public void setMainPageCtrl(MainPageCtrl mainPageCtrl) {
        this.mainPageCtrl = mainPageCtrl;
    }

    public EntrancePageRecyclerViewHeader(Activity context) {
        super(context);
        mAct = context;
    }

    private void initLoiite() {
        LayoutParams layoutParams = new LayoutParams((int) (0.24 * DimenUtils.getScreenWidth()), (int) (0.24 * DimenUtils.getScreenWidth()));
        mLottieAnimationView = new LottieAnimationView(mAct);
        mLottieAnimationView.setLayoutParams(layoutParams);
        mLottieAnimationView.loop(true);
        StringBuilder source = new StringBuilder();
        InputStream open = null;
        BufferedReader bufferedReader = null;
        try {
            open = mAct.getAssets().open("lotties/icfun_1.0.3_loading_glasses.json");
            bufferedReader = new BufferedReader(new InputStreamReader(open));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                source.append(line);
            }
            open.close();
            bufferedReader.close();
            mLottieAnimationView.setAnimation(new JSONObject(source.toString()));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            try {
                if (open != null) {
                    open.close();
                }
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        setGravity(Gravity.CENTER);
        setOrientation(VERTICAL);

        addView(mLottieAnimationView);
    }

    @NonNull
    @Override
    public View getView() {
        return this;
    }

    @NonNull
    @Override
    public SpinnerStyle getSpinnerStyle() {
        return SpinnerStyle.Translate;
    }

    @Override
    public void setPrimaryColors(int... colors) {
    }

    @Override
    public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) {

        this.kernel = kernel;

        kernel.requestDrawBackgroundFor(this , mDesColor != 0 ? mDesColor : Color.parseColor("#ffffff"));
    }

    @Override
    public void onMoving(boolean isDragging, float percent, int offset, int height, int maxDragHeight) {
        if (!mHasInit) {
            initLoiite();
            mHasInit = true;
        }
    }

    @Override
    public void onReleased(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) {
        mLottieAnimationView.playAnimation();
    }

    @Override
    public void onStartAnimator(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) {
    }

    @Override
    public int onFinish(@NonNull RefreshLayout refreshLayout, boolean success) {
        if (!NetworkUtil.isNetworkAvailable(IcFunApplication.getInstance())) {
            Commons.showNetworkUnavailableWindow(mAct);
            return 0;
        }
        mainPageCtrl.onResume();
        return 0;
    }

    @Override
    public void onHorizontalDrag(float percentX, int offsetX, int offsetMax) {

    }

    @Override
    public boolean isSupportHorizontalDrag() {
        return false;
    }

    @Override
    public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) {
        switch (newState) {
            case PullDownToRefresh:
                break;
            case RefreshFinish:
            case PullDownCanceled:
            case None:
                break;
            default:
                break;
        }
    }

}

在使用时:

        mHeader = new EntrancePageRecyclerViewHeader(mAct);
        mHeader.setMainPageCtrl(mMainPageCtrl);
        mRefreshLayout.setRefreshHeader(mHeader);
        mRefreshLayout.setEnableRefresh(true);
        mRefreshLayout.setHeaderMaxDragRate(2);

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值