소스 검색

[공통][New] appBarLayout 과 스크롤 되는 리스트에 overScroll 적용

hyodong.min 6 년 전
부모
커밋
fdde4f70c2

+ 135 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/OverScrollDriver.java

@@ -0,0 +1,135 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view;
+
+import android.support.design.widget.AppBarLayout;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+
+import me.everything.android.ui.overscroll.IOverScrollDecor;
+import me.everything.android.ui.overscroll.IOverScrollState;
+import me.everything.android.ui.overscroll.IOverScrollStateListener;
+import me.everything.android.ui.overscroll.OverScrollDecoratorHelper;
+
+/**
+ * OverScrollDriver
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019. 3. 14.]   [최초 작성]
+ * @since 2019. 3. 14.
+ */
+public class OverScrollDriver {
+
+  private boolean isCollapsed = false;
+  private IOverScrollDecor overScrollDecor;
+
+  private RecyclerView recyclerView;
+  private AppBarLayout appBarLayout;
+  private AppBarLayout.OnOffsetChangedListener listener;
+
+  public OverScrollDriver(RecyclerView recyclerView, AppBarLayout appBarLayout) {
+    this.recyclerView = recyclerView;
+    this.appBarLayout = appBarLayout;
+
+    init();
+  }
+
+  private void init() {
+    listener = (appBarLayout, verticalOffset) -> {
+//      Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " offset: " + verticalOffset);
+//      Log.d("APP# OverScrollDriver | onOffsetChanged", "|" + " range: " + appBarLayout.getTotalScrollRange());
+      if (verticalOffset == 0) {
+        // 커진 상태
+        isCollapsed = false;
+        attachOverScroll();
+      }
+      else {
+        // 줄어든 상태
+        isCollapsed = true;
+
+        if (-verticalOffset == appBarLayout.getTotalScrollRange()) {
+          attachOverScroll();
+        }
+      }
+
+    };
+
+    appBarLayout.addOnOffsetChangedListener(listener);
+  }
+
+  /**
+   * dispose
+   */
+  public void dispose() {
+    detachOverScroll();
+
+    if (null != appBarLayout) {
+      appBarLayout.removeOnOffsetChangedListener(listener);
+      appBarLayout = null;
+      listener = null;
+    }
+  }
+
+  private void detachOverScroll() {
+    if (null != overScrollDecor) {
+      overScrollDecor.detach();
+      overScrollDecor = null;
+      Log.d("APP# OverScrollDriver | detachOverScroll", "|" + " detach................");
+    }
+  }
+
+  private void attachOverScroll() {
+    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.getView().setTranslationY(0);
+
+//      overScrollDecor.setOverScrollUpdateListener(new IOverScrollUpdateListener() {
+//        @Override
+//        public void onOverScrollUpdate(IOverScrollDecor decor, int state, float offset) {
+//          Log.d("APP# OverScrollDriver | onOverScrollUpdate", "|" + " -------- offset: " + offset);
+//        }
+//      });
+    }
+  }
+}

+ 12 - 7
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/recommend/EventRecommendTagFragment.java

@@ -28,6 +28,7 @@ import kr.co.zumo.app.lifeplus.bean.api.LifeplusContentsBean;
 import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.OverScrollDriver;
 import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 
 /**
@@ -46,13 +47,14 @@ public class EventRecommendTagFragment extends FragmentBase<EventRecommendTagPre
   private TextView textViewEventTitle;
   private TextView textViewSelectTitle;
   private LinearLayout layoutTagContents;
-  private RecyclerView recyclerViewEventList;
+  private RecyclerView recyclerView;
   private ConstraintLayout layoutNothing;
   //  private LayoutInflater inflater;
 //  private HorizontalScrollView scrollTag;
   private EventRecommendTagAdapter adapter;
   private LinearLayout layoutRecyclerViewContainer;
   private AppBarLayout appBarLayout;
+  private OverScrollDriver overScrollDriver;
 
 
   @Override
@@ -70,21 +72,24 @@ public class EventRecommendTagFragment extends FragmentBase<EventRecommendTagPre
     layoutTagContents = findViewById(R.id.layout_contents);
     ConstraintLayout layoutSelectBucket = findViewById(R.id.layout_select_bucket);
     // scrollTag = findViewById(R.id.scroll_tag);
-    recyclerViewEventList = findViewById(R.id.recycler_view_event_list_detail);
+    recyclerView = findViewById(R.id.recycler_view_event_list_detail);
     layoutNothing = findViewById(R.id.layout_nothing);
     appBarLayout = findViewById(R.id.app_bar_layout);
     //inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     layoutRecyclerViewContainer = findViewById(R.id.layout_recycler_view_container);
-    recyclerViewEventList.addItemDecoration(new RecyclerView.ItemDecoration() {
+    recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
       @Override
       public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
         outRect.top = parent.getChildAdapterPosition(view) == 0 ? ResourceUtil.dpToPx(6) : ResourceUtil.dpToPx(10);
         outRect.bottom = ResourceUtil.dpToPx(10);
       }
     });
-    recyclerViewEventList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
+    recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
     layoutSelectBucket.setPadding(0, ResourceUtil.getStatusBarHeightManual(), 0, 0);
-    //.setUpOverScroll(recyclerViewEventList, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);
+    //.setUpOverScroll(recyclerView, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);
+
+
+    overScrollDriver = new OverScrollDriver(recyclerView, appBarLayout);
   }
 
   @Override
@@ -108,7 +113,7 @@ public class EventRecommendTagFragment extends FragmentBase<EventRecommendTagPre
 
   @Override
   protected void onAfterDestroy() {
-
+    overScrollDriver.dispose();
   }
 
   @Override
@@ -172,7 +177,7 @@ public class EventRecommendTagFragment extends FragmentBase<EventRecommendTagPre
   public void drawContents(List<? extends LifeplusContentsBean> beans) {
     if (null == adapter) {
       adapter = new EventRecommendTagAdapter(getContext(), beans, event -> presenter.onEvent(event));
-      recyclerViewEventList.setAdapter(adapter);
+      recyclerView.setAdapter(adapter);
     }
     else {
       adapter.update(beans);

+ 21 - 15
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/my/bucketlist/BucketListWithTagDetailFragment.java

@@ -32,6 +32,7 @@ import kr.co.zumo.app.lifeplus.helper.ScreenSizeHelper;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
+import kr.co.zumo.app.lifeplus.view.OverScrollDriver;
 import kr.co.zumo.app.lifeplus.view.custom.Tutorial;
 import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 
@@ -47,7 +48,7 @@ import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
  */
 public class BucketListWithTagDetailFragment extends FragmentBase<BucketListWithTagDetailPresenter> implements IBucketListWithTagDetailView {
 
-  private RecyclerView recyclerViewBucketListDetail;
+  private RecyclerView recyclerView;
   private BucketListDetailAdapter adapter;
 
   private TextView textTagTitle;
@@ -61,6 +62,7 @@ public class BucketListWithTagDetailFragment extends FragmentBase<BucketListWith
   private LinearLayout layoutContainerRecyclerView;
   private float textSize = 21f;
   private Tutorial tutorial;
+  private OverScrollDriver overScrollDriver;
 
   @Nullable
   @Override
@@ -79,9 +81,18 @@ public class BucketListWithTagDetailFragment extends FragmentBase<BucketListWith
     layoutTagContents = findViewById(R.id.layout_contents);
     layoutContainerRecyclerView = findViewById(R.id.layout_recycler_view_container);
     layoutNothing = findViewById(R.id.layout_nothing);
-    recyclerViewBucketListDetail = findViewById(R.id.recycler_view_bucket_list_detail);
+    recyclerView = findViewById(R.id.recycler_view_bucket_list_detail);
     appBarLayout = findViewById(R.id.app_bar_layout);
 
+    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
+    recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
+      @Override
+      public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        super.getItemOffsets(outRect, view, parent, state);
+        outRect.bottom = ResourceUtil.dpToPx(21);
+      }
+    });
+
     setTagTitle(0);
 
     if (appBarLayout.getLayoutParams() != null) {
@@ -106,6 +117,8 @@ public class BucketListWithTagDetailFragment extends FragmentBase<BucketListWith
     }
 
     textBucketTitle.setOnClickListener(view -> {presenter.onEvent(new Event.Builder(Event.UPDATE).build());});
+
+    overScrollDriver = new OverScrollDriver(recyclerView, appBarLayout);
   }
 
   @Override
@@ -127,14 +140,17 @@ public class BucketListWithTagDetailFragment extends FragmentBase<BucketListWith
 
   @Override
   protected void onAfterDestroyView() {
-    recyclerViewBucketListDetail = null;
+    recyclerView = null;
   }
 
   @Override
   protected void onAfterDestroy() {
     if (null != tutorial) {
       tutorial.cancel();
+      tutorial = null;
     }
+    
+    overScrollDriver.dispose();
   }
 
   @Override
@@ -148,8 +164,6 @@ public class BucketListWithTagDetailFragment extends FragmentBase<BucketListWith
   @Override
   public void onStart() {
     super.onStart();
-    ScreenSizeHelper helper = getHelper(ScreenSizeHelper.class);
-    tutorial = new Tutorial(helper.getScreenWidth());
   }
 
   @Override
@@ -200,16 +214,8 @@ public class BucketListWithTagDetailFragment extends FragmentBase<BucketListWith
         // contents event
         presenter.onEvent(event);
       });
-      recyclerViewBucketListDetail.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
-      recyclerViewBucketListDetail.addItemDecoration(new RecyclerView.ItemDecoration() {
-        @Override
-        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
-          super.getItemOffsets(outRect, view, parent, state);
-          outRect.bottom = ResourceUtil.dpToPx(21);
-        }
-      });
-      recyclerViewBucketListDetail.setAdapter(adapter);
-      // OverScrollDecoratorHelper.setUpOverScroll(recyclerViewBucketListDetail, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);
+      recyclerView.setAdapter(adapter);
+      // OverScrollDecoratorHelper.setUpOverScroll(recyclerView, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);
     }
     else {
       // update