|
|
@@ -24,12 +24,23 @@ import me.everything.android.ui.overscroll.OverScrollDecoratorHelper;
|
|
|
*/
|
|
|
public class OverScrollDriver {
|
|
|
|
|
|
- private boolean isCollapsed = false;
|
|
|
+ private static final int COLLAPSED = 0;
|
|
|
+ private static final int EXPENDED = 1;
|
|
|
+ private static final int NONE = -1;
|
|
|
+ private static final int IDLE = 2;
|
|
|
+
|
|
|
+ private int collapsedStatus = EXPENDED;
|
|
|
private IOverScrollDecor overScrollDecor;
|
|
|
|
|
|
private RecyclerView recyclerView;
|
|
|
private AppBarLayout appBarLayout;
|
|
|
private AppBarLayout.OnOffsetChangedListener listener;
|
|
|
+ private IOverScrollStateListener overScrollStateListener;
|
|
|
+
|
|
|
+ public OverScrollDriver(RecyclerView recyclerView, AppBarLayout appBarLayout, IOverScrollStateListener overScrollStateListener) {
|
|
|
+ this(recyclerView, appBarLayout);
|
|
|
+ this.overScrollStateListener = overScrollStateListener;
|
|
|
+ }
|
|
|
|
|
|
public OverScrollDriver(RecyclerView recyclerView, AppBarLayout appBarLayout) {
|
|
|
this.recyclerView = recyclerView;
|
|
|
@@ -40,16 +51,22 @@ public class OverScrollDriver {
|
|
|
|
|
|
private void init() {
|
|
|
listener = (appBarLayout, verticalOffset) -> {
|
|
|
-// Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " offset: " + verticalOffset);
|
|
|
-// Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " range: " + appBarLayout.getTotalScrollRange());
|
|
|
+ Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " offset: " + verticalOffset);
|
|
|
+ Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " range: " + appBarLayout.getTotalScrollRange());
|
|
|
+
|
|
|
+ if (collapsedStatus == NONE) {
|
|
|
+ Log.d("APP# OverScrollDriver | init", "|" + " collapsedStatus == NONE");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (verticalOffset == 0) {
|
|
|
// 커진 상태
|
|
|
- isCollapsed = false;
|
|
|
+ collapsedStatus = EXPENDED;
|
|
|
attachOverScroll();
|
|
|
}
|
|
|
else {
|
|
|
// 줄어든 상태
|
|
|
- isCollapsed = true;
|
|
|
+ collapsedStatus = COLLAPSED;
|
|
|
|
|
|
if (-verticalOffset == appBarLayout.getTotalScrollRange()) {
|
|
|
attachOverScroll();
|
|
|
@@ -61,6 +78,21 @@ public class OverScrollDriver {
|
|
|
appBarLayout.addOnOffsetChangedListener(listener);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 접히는 상태를 NONE 으로 만들면 상태 변경이 되지않아 이벤트가 attach/detach 되지 않는다.
|
|
|
+ */
|
|
|
+ public void setCollapsedStatusNone() {
|
|
|
+ collapsedStatus = NONE;
|
|
|
+ attachOverScroll();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 접히는 상태를 반영한다.
|
|
|
+ */
|
|
|
+ public void setCollapsedStatusIdle() {
|
|
|
+ collapsedStatus = IDLE;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* dispose
|
|
|
*/
|
|
|
@@ -86,40 +118,40 @@ public class OverScrollDriver {
|
|
|
if (null == overScrollDecor) {
|
|
|
Log.d("APP# OverScrollDriver | attachOverScroll", "|" + " attach_______________");
|
|
|
overScrollDecor = OverScrollDecoratorHelper.setUpOverScroll(recyclerView, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);
|
|
|
- overScrollDecor.setOverScrollStateListener(new IOverScrollStateListener() {
|
|
|
- @Override
|
|
|
- public void onOverScrollStateChange(IOverScrollDecor decor, int oldState, int newState) {
|
|
|
- switch (newState) {
|
|
|
- case IOverScrollState.STATE_IDLE:
|
|
|
- // No over-scroll is in effect.
|
|
|
- Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "idle");
|
|
|
- break;
|
|
|
- case IOverScrollState.STATE_DRAG_START_SIDE:
|
|
|
- // Dragging started at the left-end.
|
|
|
- if (isCollapsed) {
|
|
|
- detachOverScroll();
|
|
|
- }
|
|
|
- break;
|
|
|
- case IOverScrollState.STATE_DRAG_END_SIDE:
|
|
|
- // Dragging started at the right-end.
|
|
|
- if (false == isCollapsed) {
|
|
|
- detachOverScroll();
|
|
|
- }
|
|
|
- break;
|
|
|
- case IOverScrollState.STATE_BOUNCE_BACK:
|
|
|
- Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "bounce back --> " + oldState);
|
|
|
- if (oldState == IOverScrollState.STATE_DRAG_START_SIDE) {
|
|
|
- // Dragging stopped -- view is starting to bounce back from the *left-end* onto natural position.
|
|
|
- }
|
|
|
- else { // i.e. (oldState == STATE_DRAG_END_SIDE)
|
|
|
- // View is starting to bounce back from the *right-end*.
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
+ overScrollDecor.setOverScrollStateListener((decor, oldState, newState) -> {
|
|
|
+ switch (newState) {
|
|
|
+ case IOverScrollState.STATE_IDLE:
|
|
|
+ // No over-scroll is in effect.
|
|
|
+ Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "idle");
|
|
|
+ break;
|
|
|
+ case IOverScrollState.STATE_DRAG_START_SIDE:
|
|
|
+ // Dragging started at the left-end.
|
|
|
+ if (collapsedStatus == COLLAPSED) {
|
|
|
+ detachOverScroll();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case IOverScrollState.STATE_DRAG_END_SIDE:
|
|
|
+ // Dragging started at the right-end.
|
|
|
+ if (collapsedStatus == EXPENDED) {
|
|
|
+ detachOverScroll();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case IOverScrollState.STATE_BOUNCE_BACK:
|
|
|
+ Log.d("APP# OverScrollDriver | onOverScrollStateChange", "|" + "bounce back --> " + oldState);
|
|
|
+ if (oldState == IOverScrollState.STATE_DRAG_START_SIDE) {
|
|
|
+ // Dragging stopped -- view is starting to bounce back from the *left-end* onto natural position.
|
|
|
+ }
|
|
|
+ else { // i.e. (oldState == STATE_DRAG_END_SIDE)
|
|
|
+ // View is starting to bounce back from the *right-end*.
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
+ if (null != overScrollStateListener) {
|
|
|
+ overScrollStateListener.onOverScrollStateChange(decor, oldState, newState);
|
|
|
+ }
|
|
|
});
|
|
|
|
|
|
overScrollDecor.getView().setTranslationY(0);
|