詹子聪 6 gadi atpakaļ
vecāks
revīzija
ea396b98d5

+ 10 - 45
app/src/main/java/com/itant/shibei/ui/TabActivity.java

@@ -26,6 +26,7 @@ import com.itant.shibei.ui.home.GoodsFragment;
 import com.itant.shibei.ui.home.HomeFragment;
 import com.itant.shibei.ui.mine.MineActivity;
 import com.itant.shibei.ui.mine.MineFragment;
+import com.itant.shibei.widget.AppbarTranslateListener;
 import com.miekir.common.adapter.TabFragmentAdapter;
 import com.miekir.common.utils.ViewTool;
 import com.socks.library.KLog;
@@ -36,12 +37,6 @@ import java.util.List;
 
 public class TabActivity extends BaseShiBeiActivity implements View.OnClickListener {
 
-    private RelativeLayout rl_search;
-    private RelativeLayout rl_search_top;
-    private ImageView iv_search;
-    private ImageView iv_search_top;
-
-    private double mDefaultImageSize;
 
     @Override
     public int getLayoutID() {
@@ -67,48 +62,18 @@ public class TabActivity extends BaseShiBeiActivity implements View.OnClickListe
 
         ViewTool.setOnClickListener(this, new int[]{R.id.rl_search_top, R.id.rl_more}, this);
 
-        mDefaultImageSize = getResources().getDimension(R.dimen.size_image_s);
-        rl_search = findViewById(R.id.rl_search);
-        iv_search = findViewById(R.id.iv_search);
-        rl_search_top = findViewById(R.id.rl_search_top);
-        iv_search_top = findViewById(R.id.iv_search_top);
+        double mDefaultImageSize = getResources().getDimension(R.dimen.size_image_s);
+        View rl_search = findViewById(R.id.rl_search);
+        View iv_search = findViewById(R.id.iv_search);
+        View rl_search_top = findViewById(R.id.rl_search_top);
+        View iv_search_top = findViewById(R.id.iv_search_top);
+
         AppBarLayout abl_main = findViewById(R.id.abl_main);
-        abl_main.addOnOffsetChangedListener(mAppBarOffsetChangedListener);
+        AppbarTranslateListener listener = new AppbarTranslateListener(mDefaultImageSize,
+                rl_search_top, iv_search_top, rl_search, iv_search);
+        abl_main.addOnOffsetChangedListener(listener);
     }
 
-    private AppBarLayout.OnOffsetChangedListener mAppBarOffsetChangedListener = new AppBarLayout.OnOffsetChangedListener() {
-        @Override
-        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
-            // AppBarLayout完全折叠时,fraction为1
-            float fraction = ((float) Math.abs(verticalOffset)) / appBarLayout.getTotalScrollRange();
-
-            float reFraction = 1 - fraction;
-            if (reFraction < 0.007) {
-                // 完全折叠
-                rl_search_top.setVisibility(View.GONE);
-                rl_search.setVisibility(View.VISIBLE);
-            } else if (reFraction > 0.988) {
-                // 完全展开
-                rl_search.setVisibility(View.GONE);
-                rl_search_top.setVisibility(View.VISIBLE);
-            } else {
-                rl_search.setVisibility(View.VISIBLE);
-                rl_search_top.setVisibility(View.VISIBLE);
-            }
-
-            double searchSize = mDefaultImageSize * fraction;
-            ViewGroup.LayoutParams searchParams = iv_search.getLayoutParams();
-            searchParams.width = (int) searchSize;
-            searchParams.height = (int) searchSize;
-            iv_search.requestLayout();
-
-            double topSearchSize = mDefaultImageSize - searchSize;
-            ViewGroup.LayoutParams topSearchParams = iv_search_top.getLayoutParams();
-            topSearchParams.width = (int) topSearchSize;
-            topSearchParams.height = (int) topSearchSize;
-            iv_search_top.requestLayout();
-        }
-    };
 
 
     @Override

+ 92 - 0
app/src/main/java/com/itant/shibei/widget/AppbarTranslateListener.java

@@ -0,0 +1,92 @@
+package com.itant.shibei.widget;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.google.android.material.appbar.AppBarLayout;
+
+/**
+ * Copyright (C), 2019-2020, Genlot
+ *
+ * @author 詹子聪
+ * @date 2020/7/21 8:35
+ * Description: AppBar移动时的图标动画监听
+ */
+public class AppbarTranslateListener implements AppBarLayout.OnOffsetChangedListener {
+    private static final int STATUS_CLOSE = 1;
+    private static final int STATUS_OPEN = 2;
+    private static final int STATUS_MOVE = 3;
+
+    private double mDefaultImageSize;
+    /**
+     * 1. 完全关闭 2. 完全打开 3.运动中
+     */
+    private int mLastStatus = STATUS_CLOSE;
+
+    private View rl_search_top;
+    private View rl_search;
+    private View iv_search_top;
+    private View iv_search;
+
+    private long mLastAnimateMillis;
+
+    public AppbarTranslateListener(double defaultImageSize, View rl_search_top, View iv_search_top, View rl_search, View iv_search) {
+        mDefaultImageSize = defaultImageSize;
+        this.rl_search = rl_search;
+        this.rl_search_top = rl_search_top;
+        this.iv_search = iv_search;
+        this.iv_search_top = iv_search_top;
+    }
+
+    @Override
+    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
+        // 小于10ms的间隔直接忽略
+        if (System.currentTimeMillis() - mLastAnimateMillis < 10) {
+            return;
+        }
+        mLastAnimateMillis = System.currentTimeMillis();
+
+        // AppBarLayout完全折叠时,fraction为1
+        float fraction = ((float) Math.abs(verticalOffset)) / appBarLayout.getTotalScrollRange();
+
+        float reFraction = 1 - fraction;
+        if (reFraction < 0.007) {
+            // 完全折叠
+            if (mLastStatus != STATUS_CLOSE) {
+                rl_search_top.setVisibility(View.GONE);
+                rl_search.setVisibility(View.VISIBLE);
+                mLastStatus = STATUS_CLOSE;
+            } else {
+                return;
+            }
+
+        } else if (reFraction > 0.988) {
+            // 完全展开
+            if (mLastStatus != STATUS_OPEN) {
+                rl_search.setVisibility(View.GONE);
+                rl_search_top.setVisibility(View.VISIBLE);
+                mLastStatus = STATUS_OPEN;
+            } else {
+                return;
+            }
+        } else {
+            if (mLastStatus != STATUS_MOVE) {
+                rl_search.setVisibility(View.VISIBLE);
+                rl_search_top.setVisibility(View.VISIBLE);
+                mLastStatus = STATUS_MOVE;
+            }
+        }
+
+        double searchSize = mDefaultImageSize * fraction;
+        ViewGroup.LayoutParams searchParams = iv_search.getLayoutParams();
+        searchParams.width = (int) searchSize;
+        searchParams.height = (int) searchSize;
+        iv_search.requestLayout();
+
+        double topSearchSize = mDefaultImageSize - searchSize;
+        ViewGroup.LayoutParams topSearchParams = iv_search_top.getLayoutParams();
+        topSearchParams.width = (int) topSearchSize;
+        topSearchParams.height = (int) topSearchSize;
+        iv_search_top.requestLayout();
+    }
+}

+ 1 - 1
app/src/main/res/layout/activity_tab.xml

@@ -51,7 +51,7 @@
                     android:id="@+id/iv_search_top"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_centerVertical="true"
+                    android:layout_centerInParent="true"
                     android:src="@drawable/ic_search"
                     android:tint="@color/black_theme" />
             </RelativeLayout>