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);