Skip to content

Commit

Permalink
添加 新版 autoRefresh 代码框架
Browse files Browse the repository at this point in the history
  • Loading branch information
scwang90 committed Nov 3, 2022
1 parent 2d788fb commit 26327d6
Show file tree
Hide file tree
Showing 10 changed files with 127 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -207,5 +207,10 @@ public void onHorizontalDrag(float percentX, int offsetX, int offsetMax) {
public boolean isSupportHorizontalDrag() {
return false;
}

@Override
public boolean autoRefresh(int delayed, int duration, float dragRate, boolean animationOnly) {
return false;
}
}
}
2 changes: 1 addition & 1 deletion refresh-footer/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ android {
buildToolsVersion '28.0.3'

defaultConfig {
minSdkVersion 12
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName "1.0"
Expand Down
2 changes: 1 addition & 1 deletion refresh-header/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ android {

defaultConfig {

minSdkVersion 12
minSdkVersion 14
targetSdkVersion 28

versionCode 1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.scwang.smartrefresh.header;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
Expand Down Expand Up @@ -51,13 +53,15 @@ public class MaterialHeader extends InternalAbstract implements RefreshHeader {
protected boolean mFinished;
protected int mCircleDiameter;
protected ImageView mCircleView;
protected RefreshKernel mKernel;
protected MaterialProgressDrawable mProgress;

/**
* 贝塞尔背景
*/
protected int mWaveHeight;
protected int mHeadHeight;
protected int mInitHeight;
protected Path mBezierPath;
protected Paint mBezierPaint;
protected RefreshState mState;
Expand Down Expand Up @@ -172,6 +176,8 @@ public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDrag
if (thisView.isInEditMode()) {
mWaveHeight = mHeadHeight = height / 2;
}
mKernel = kernel;
mInitHeight = height;
}

@Override
Expand Down Expand Up @@ -217,7 +223,7 @@ public void onMoving(boolean isDragging, float percent, int offset, int height,
}

@Override
public void onReleased(@NonNull RefreshLayout layout, int height, int maxDragHeight) {
public void onStartAnimator(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) {
mProgress.start();
}

Expand Down Expand Up @@ -356,4 +362,27 @@ public MaterialHeader setScrollableWhenRefreshing(boolean scrollable) {
return this;
}
//</editor-fold>


@Override
public boolean autoRefresh(int delayed, int duration, float dragRate, final boolean animationOnly) {
if (mShowBezierWave) {
//如果显示背景,使用旧版的 autoRefresh 动画
return false;
}
final View circleView = mCircleView;
circleView.setAlpha(1);
circleView.setScaleX(0);
circleView.setScaleY(0);
circleView.setTranslationY(mInitHeight / 2f + mCircleDiameter / 2f);
circleView.animate().scaleX(1).scaleY(1).setStartDelay(delayed).setDuration(duration).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// mProgress.showArrow(false);
mProgress.start();
mKernel.onAutoRefreshAnimationEnd(animation, animationOnly);
}
});
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ public class MaterialProgressDrawable extends Drawable implements Animatable {
private float mWidth;
private float mHeight;
boolean mFinishing;
boolean mIsRunning;

public MaterialProgressDrawable(View parent) {
mParent = parent;
Expand Down Expand Up @@ -268,41 +269,48 @@ public int getOpacity() {

@Override
public boolean isRunning() {
final List<Animation> animators = mAnimators;
final int N = animators.size();
for (int i = 0; i < N; i++) {
final Animation animator = animators.get(i);
if (animator.hasStarted() && !animator.hasEnded()) {
return true;
}
}
return false;
return mIsRunning;
// final List<Animation> animators = mAnimators;
// final int N = animators.size();
// for (int i = 0; i < N; i++) {
// final Animation animator = animators.get(i);
// if (animator.hasStarted() && !animator.hasEnded()) {
// return true;
// }
// }
// return false;
}

@Override
public void start() {
mAnimation.reset();
mRing.storeOriginals();
// Already showing some part of the ring
if (mRing.mEndTrim != mRing.mStartTrim) {
mFinishing = true;
mAnimation.setDuration(ANIMATION_DURATION / 2);
mParent.startAnimation(mAnimation);
} else {
mRing.setColorIndex(0);
mRing.resetOriginals();
mAnimation.setDuration(ANIMATION_DURATION);
mParent.startAnimation(mAnimation);
if (!mIsRunning) {
mAnimation.reset();
mRing.storeOriginals();
// Already showing some part of the ring
if (mRing.mEndTrim != mRing.mStartTrim) {
mFinishing = true;
mAnimation.setDuration(ANIMATION_DURATION / 2);
mParent.startAnimation(mAnimation);
} else {
mRing.setColorIndex(0);
mRing.resetOriginals();
mAnimation.setDuration(ANIMATION_DURATION);
mParent.startAnimation(mAnimation);
}
mIsRunning = true;
}
}

@Override
public void stop() {
mParent.clearAnimation();
mRing.setColorIndex(0);
mRing.resetOriginals();
showArrow(false);
setRotation(0);
if (mIsRunning) {
mParent.clearAnimation();
mRing.setColorIndex(0);
mRing.resetOriginals();
showArrow(false);
setRotation(0);
mIsRunning = false;
}
}

float getMinProgressArc(Ring ring) {
Expand Down
2 changes: 1 addition & 1 deletion refresh-layout/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ android {
buildToolsVersion '28.0.3'

defaultConfig {
minSdkVersion 12
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName "1.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3269,6 +3269,13 @@ public boolean autoRefreshAnimationOnly() {
@Override
public boolean autoRefresh(int delayed, final int duration, final float dragRate,final boolean animationOnly) {
if (mState == RefreshState.None && isEnableRefreshOrLoadMore(mEnableRefresh)) {
setViceState(RefreshState.Refreshing);
if (mRefreshHeader.autoRefresh(delayed, duration, dragRate, animationOnly)) {
/*
* 2022-11-03 添加Header可以自己实现 autoRefresh ,返回true表示支持,返回False表示不支持,使用老版本的 autoRefresh
*/
return true;
}
Runnable runnable = new Runnable() {
@Override
public void run() {
Expand Down Expand Up @@ -3297,27 +3304,12 @@ public void onAnimationUpdate(ValueAnimator animation) {
reboundAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (animation != null && animation.getDuration() == 0) {
return;//0 表示被取消
}
reboundAnimator = null;
if (mRefreshHeader != null) {
if (mState != RefreshState.ReleaseToRefresh) {
mKernel.setState(RefreshState.ReleaseToRefresh);
}
setStateRefreshing(!animationOnly);
} else {
/*
* 2019-12-24 修复 mRefreshHeader=null 时状态错乱问题
*/
mKernel.setState(RefreshState.None);
}
mKernel.onAutoRefreshAnimationEnd(animation, animationOnly);
}
});
reboundAnimator.start();
}
};
setViceState(RefreshState.Refreshing);
if (delayed > 0) {
mHandler.postDelayed(runnable, delayed);
} else {
Expand Down Expand Up @@ -3900,6 +3892,27 @@ public RefreshKernel requestFloorParams(int duration, float openLayoutRate, floa
mFloorBottomDragLayoutRate = dragLayoutRate;
return this;
}

@Override
public RefreshKernel onAutoRefreshAnimationEnd(Animator animation, boolean animationOnly) {
if (animation != null && animation.getDuration() == 0) {
return this;//0 表示被取消
}
reboundAnimator = null;
if (mRefreshHeader != null) {
if (mState != RefreshState.ReleaseToRefresh) {
this.setState(RefreshState.ReleaseToRefresh);
}
SmartRefreshLayout.this.setStateRefreshing(!animationOnly);
} else {
/*
* 2019-12-24 修复 mRefreshHeader=null 时状态错乱问题
*/
this.setState(RefreshState.None);
}
return this;
}

//</editor-fold>
}
//</editor-fold>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,17 @@ public interface RefreshInternal extends OnStateChangedListener {
* @return 水平拖动需要消耗更多的时间和资源,所以如果不支持请返回false
*/
boolean isSupportHorizontalDrag();

/**
* Display refresh animation, Multifunction.
* 显示刷新动画并且触发刷新事件
* @param delayed 开始延时
* @param duration 拖拽动画持续时间
* @param dragRate 拉拽的高度比率
* @param animationOnly animation only 只有动画
* @return If False is returned, this header does not support automatic refresh
* 返回 False 代表本Header不支持自动刷新
*/
boolean autoRefresh(int delayed, int duration, float dragRate, boolean animationOnly);

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.scwang.smartrefresh.layout.api;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.support.annotation.NonNull;

Expand Down Expand Up @@ -86,5 +87,12 @@ public interface RefreshKernel {
* @return RefreshKernel
*/
RefreshKernel requestFloorParams(int duration, float openLayoutRate, float dragLayoutRate);
/**
* 当 autoRefresh 动画结束时,处理刷新状态的事件
* @param animation 动画对象
* @param animationOnly 是否只播放动画,不通知事件
* @return RefreshKernel
*/
RefreshKernel onAutoRefreshAnimationEnd(Animator animation, boolean animationOnly);
//</editor-fold>
}
Original file line number Diff line number Diff line change
Expand Up @@ -190,4 +190,9 @@ public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull Refres
public boolean setNoMoreData(boolean noMoreData) {
return mWrappedInternal instanceof RefreshFooter && ((RefreshFooter) mWrappedInternal).setNoMoreData(noMoreData);
}

@Override
public boolean autoRefresh(int delayed, int duration, float dragRate, boolean animationOnly) {
return false;
}
}

0 comments on commit 26327d6

Please sign in to comment.