基于PtrFrameLayout实现自定义仿京东下拉刷新控件
前言
最近基于项目需要,使用PtrFrameLayout框架实现了自定义的下拉刷新控件,大体效果类似于京东APP的下拉刷新动态效果。在这里和大家分享一下具体的思路和需要注意的地方,以便帮助有类似开发和学习需求的同学省点时间。如果这篇文章对大家实际开发有所帮助,还望大家多多转发。
由于项目原因,本文不会涉及详细的具体实现,主要是提供思路和关键点。感兴趣的欢迎大家加入学习小组QQ群: 193765960,该群是技术分享和讨论群,还请遵守小组纪律。
版权归作者所有,如有转发,请注明文章出处:https://xiaodanchen.github.io/
PtrFrameLayout开源项目下载地址
实现的目标和效果
1,尽可能的能够包裹各类布局和控件,不要仅仅适用于listview。
2,通过animation-list的xml作为动画的来源,方便替换
3,head部分通过layout xml定义,包括至少三部分:动画部分,刷新状态提示,上次刷新时间提示
(注:控件不支持上拉加载,其实按照逻辑,加载部分应该由子view自己实现比较好)
关键类
- MyPtrFrameLayout.java:最终控件,在我们的layout xml中用来包裹我们需要下拉刷新的布局。该类主要参照官方的PtrClassicFrameLayout.java实现。
- MyPtrHeaderView.java:MyPtrFrameLayout的头部,布局由layout_header_view.xml定义。该类主要参照官方的PtrClassicDefaultHeader.java实现。
- MyPtrAnimationDrawable.java:MyPtrHeaderView的动画部分,动画来源于自定义的res/drawable/xxx_animation.xml
代码精要
MyPtrAnimationDrawable.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class MyPtrAnimationDrawable extends Drawable implements Animatable { public MyPtrAnimationDrawable(Context context, View parent) { mContext = context; mParent = parent; initAnimations(); } ...... @Override public void start() { mAnimation.start(); } @Override public void stop() { mAnimation.stop(); } private void initAnimations() { mParent.setBackgroundResource(R.drawable.xxx_animation); mAnimation = (AnimationDrawable) mParent.getBackground(); } ...... }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class MyPtrHeaderView extends FrameLayout implements PtrUIHandler { ...... protected void initViews() { View header = LayoutInflater.from(getContext()).inflate(R.layout.layout_header_view, this); mAnimaView = header.findViewById(R.id.xxx); mDrawable = new MyPtrAnimationDrawable(mContext, mAnimaView); mDrawable.start(); mRefreshTextView = (TextView) header.findViewById(R.id.yyy); mLastUpdateTextView = (TextView) header.findViewById(R.id.zzz); } ...... }
|
MyPtrFrameLayout.java
重要的知识点(*)
经查资料,发现官方早已给我们封装好了默认的处理类。不废话,直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private void initView(){ frame = (MyPtrFrameLayout) view.findViewById(R.id.my_ptr_framelayout); frame.setPullToRefresh(true); frame.setLastUpdateTimeKey(HomePage.class.getName()); frame.setPtrHandler(new PtrDefaultHandler() { @Override public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) { return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header)&&!frame.isRefreshing(); } @Override public void onRefreshBegin(PtrFrameLayout frame) { } }); }
|
参考:
下拉刷新PtrFrameLayout组件的使用
这篇文章中所用到的代码项目原因可能具有版权问题,大家是在实际开发中还是以参考借鉴为主吧。最后,如果这篇文章对大家有帮助,大家就偷偷看吧,项目原因就不要太扩散了。