詹子聪 5 éve
szülő
commit
1c744b093b

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -15,7 +15,7 @@
         android:theme="@style/AppTheme"
         android:requestLegacyExternalStorage="true"
         android:networkSecurityConfig="@xml/network">
-        <activity android:name=".MainActivity"
+        <activity android:name=".ui.MainActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:screenOrientation="portrait"
             android:theme="@style/AppTheme">

+ 0 - 15
app/src/main/java/com/miekir/ym/MainActivity.kt

@@ -1,15 +0,0 @@
-package com.miekir.ym
-
-import androidx.appcompat.app.AppCompatActivity
-import android.os.Bundle
-import com.miekir.mvp.view.BaseMvpActivity
-
-class MainActivity : BaseMvpActivity() {
-    override fun getLayoutId(): Int {
-        return R.layout.activity_main
-    }
-
-    override fun initViews(savedInstanceState: Bundle?) {
-
-    }
-}

+ 19 - 0
app/src/main/java/com/miekir/ym/base/YangActivity.kt

@@ -0,0 +1,19 @@
+package com.miekir.ym.base
+
+import android.os.Bundle
+import android.view.View
+import com.miekir.mvp.view.BaseMvpActivity
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ * @author Miekir
+ * @date 2020/11/24 21:23
+ * Description:
+ */
+abstract class YangActivity : BaseMvpActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        window.decorView.systemUiVisibility =
+            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
+    }
+}

+ 129 - 0
app/src/main/java/com/miekir/ym/listener/AppbarTranslateListener.java

@@ -0,0 +1,129 @@
+package com.miekir.ym.listener;
+
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.app.Activity;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.google.android.material.appbar.AppBarLayout;
+
+/**
+ *
+ *
+ * @author Miekir
+ * @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;
+    /**
+     * 1. 完全关闭 2. 完全打开 3.运动中
+     */
+    private int mLastStatus = STATUS_CLOSE;
+
+    private double mDefaultHeight;
+    private double mDefaultWidth;
+
+    private ViewGroup mViewGroup;
+    private View rl_search_top;
+    private View rl_search_top_shadow;
+    private View rl_search;
+
+    private long mLastAnimateMillis;
+
+    public AppbarTranslateListener(Activity activity,
+                                   double defaultWidth, double defaultHeight,
+                                   View rl_search_top, View rl_search_top_shadow,
+                                   View rl_search) {
+        mViewGroup = (ViewGroup) activity.getWindow().getDecorView();
+
+        mDefaultWidth = defaultWidth;
+        mDefaultHeight = defaultHeight;
+        this.rl_search = rl_search;
+        this.rl_search_top = rl_search_top;
+        this.rl_search_top_shadow = rl_search_top_shadow;
+    }
+
+    @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) {
+                mLastStatus = STATUS_CLOSE;
+                mViewGroup.getOverlay().remove(rl_search_top);
+                rl_search.setVisibility(View.VISIBLE);
+            } else {
+                return;
+            }
+        } else {
+            rl_search.setVisibility(View.INVISIBLE);
+            if (reFraction > 0.988) {
+                // 完全展开
+                if (mLastStatus != STATUS_OPEN) {
+                    mLastStatus = STATUS_OPEN;
+                    rl_search_top_shadow.setVisibility(View.VISIBLE);
+                    mViewGroup.getOverlay().add(rl_search_top);
+                } else {
+                    return;
+                }
+            } else {
+                // 移动中
+                if (mLastStatus != STATUS_MOVE) {
+                    mLastStatus = STATUS_MOVE;
+                    rl_search_top_shadow.setVisibility(View.INVISIBLE);
+                }
+            }
+        }
+
+        followFinger(fraction);
+
+        /*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();*/
+    }
+
+
+
+
+    private void followFinger(float fraction) {
+        // 完全展开时fraction为0,所以实时translationX为mDefaultWidth*fraction,
+        // translationY为mDefaultHeight*fraction
+
+        // add之后,要紧接动画
+        mViewGroup.getOverlay().add(rl_search_top);
+        // 横向移动
+        ObjectAnimator tranXAnim = ObjectAnimator.ofFloat(rl_search_top, "translationX", (float) (mDefaultWidth*fraction));
+        tranXAnim.setDuration(0);
+        // 纵向移动
+        ObjectAnimator tranYAnim = ObjectAnimator.ofFloat(rl_search_top, "translationY", (float) (-mDefaultHeight*fraction));
+        tranYAnim.setDuration(0);
+
+        //tranXAnim.start();
+
+        // 一起做运动
+        AnimatorSet set = new AnimatorSet();
+        set.playTogether(tranXAnim, tranYAnim);
+        set.start();
+    }
+}

+ 11 - 0
app/src/main/java/com/miekir/ym/listener/ITopActionListener.java

@@ -0,0 +1,11 @@
+package com.miekir.ym.listener;
+
+/**
+ *
+ * @author Miekir
+ * @date 2020/8/2 9:19
+ * Description: 监听滚动到顶部的动作
+ */
+public interface ITopActionListener {
+    void onTopAction();
+}

+ 53 - 0
app/src/main/java/com/miekir/ym/ui/MainActivity.kt

@@ -0,0 +1,53 @@
+package com.miekir.ym.ui
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import com.flyco.tablayout.listener.OnTabSelectListener
+import com.miekir.common.adapter.TabFragmentAdapter
+import com.miekir.ym.R
+import com.miekir.ym.base.YangActivity
+import com.miekir.ym.listener.AppbarTranslateListener
+import com.miekir.ym.listener.ITopActionListener
+import com.miekir.ym.ui.about.AboutFragment
+import kotlinx.android.synthetic.main.activity_main.*
+import java.util.*
+
+class MainActivity : YangActivity() {
+    override fun getLayoutId(): Int {
+        return R.layout.activity_main
+    }
+
+    override fun initViews(savedInstanceState: Bundle?) {
+        val titles = arrayOf("数码", "美食", "工具", "关于")
+        val fragments: ArrayList<Fragment> = ArrayList()
+        fragments.add(AboutFragment())
+        fragments.add(AboutFragment())
+        fragments.add(AboutFragment())
+        fragments.add(AboutFragment())
+
+        val adapter = TabFragmentAdapter(supportFragmentManager, fragments)
+        vp_main.adapter = adapter
+        vp_main.offscreenPageLimit = titles.size
+        stl_home.setViewPager(vp_main, titles)
+        stl_home.currentTab = 0
+        stl_home.setOnTabSelectListener(object : OnTabSelectListener {
+            override fun onTabSelect(position: Int) {}
+            override fun onTabReselect(position: Int) {
+                val fragment = fragments[position]
+                if (fragment is ITopActionListener) {
+                    // 重复选中Tab可以让该Tab对应的列表滚动到顶部
+                    fragment.onTopAction()
+                }
+            }
+        })
+
+        val defaultHeight = resources.getDimension(R.dimen.margin_default).toDouble()
+        val defaultWidth = resources.getDimension(R.dimen.height_edit_text).toDouble()
+        val listener = AppbarTranslateListener(
+            this,
+            defaultWidth, defaultHeight,
+            rl_search_top, rl_search_top_shadow, rl_search
+        )
+        abl_main.addOnOffsetChangedListener(listener)
+    }
+}

+ 27 - 0
app/src/main/java/com/miekir/ym/ui/about/AboutFragment.kt

@@ -0,0 +1,27 @@
+package com.miekir.ym.ui.about
+
+import com.miekir.mvp.view.BaseMvpFragment
+import com.miekir.ym.R
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ * @author Miekir
+ * @date 2020/11/24 20:27
+ * Description:
+ */
+class AboutFragment : BaseMvpFragment() {
+
+    override fun getLayoutId(): Int {
+        return R.layout.fragment_about
+    }
+
+    override fun onViewInit() {
+
+    }
+
+    override fun onLazyLoad() {
+    }
+
+
+
+}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 10 - 0
app/src/main/res/drawable/ic_launcher.xml


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 119 - 0
app/src/main/res/layout/fragment_about.xml


+ 6 - 0
app/src/main/res/layout/view_divider.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<View
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="1px"
+    android:background="@color/gray_status_bar" />

+ 22 - 0
app/src/main/res/layout/view_toolbar.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <androidx.appcompat.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="?attr/actionBarSize"
+            android:background="@color/white"
+            app:titleTextAppearance="@style/Toolbar.TitleText" />
+
+        <include layout="@layout/view_divider" />
+
+
+    </LinearLayout>
+</merge>