瀏覽代碼

status bar for every devices

hanjing 6 年之前
父節點
當前提交
ff0656bef3

+ 124 - 0
app/src/main/java/com/sheep/gamegroup/util/statusbar/OSUtils.java

@@ -0,0 +1,124 @@
+package com.sheep.gamegroup.util.statusbar;
+
+import android.os.Build;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class OSUtils {
+
+    private static final String TAG = "Rom";
+
+    public static final String ROM_MIUI = "MIUI";
+    public static final String ROM_EMUI = "EMUI";
+    public static final String ROM_FLYME = "FLYME";
+    public static final String ROM_OPPO = "OPPO";
+    public static final String ROM_SMARTISAN = "SMARTISAN";
+    public static final String ROM_VIVO = "VIVO";
+    public static final String ROM_QIKU = "QIKU";
+
+    private static final String KEY_VERSION_MIUI = "ro.miui.ui.version.name";
+    private static final String KEY_VERSION_EMUI = "ro.build.version.emui";
+    private static final String KEY_VERSION_OPPO = "ro.build.version.opporom";
+    private static final String KEY_VERSION_SMARTISAN = "ro.smartisan.version";
+    private static final String KEY_VERSION_VIVO = "ro.vivo.os.version";
+
+    private static String sName;
+    private static String sVersion;
+
+    public static boolean isEmui() {
+        return check(ROM_EMUI);
+    }
+
+    public static boolean isMiui() {
+        return check(ROM_MIUI);
+    }
+
+    public static boolean isVivo() {
+        return check(ROM_VIVO);
+    }
+
+    public static boolean isOppo() {
+        return check(ROM_OPPO);
+    }
+
+    public static boolean isFlyme() {
+        return check(ROM_FLYME);
+    }
+
+    public static boolean is360() {
+        return check(ROM_QIKU) || check("360");
+    }
+
+    public static boolean isSmartisan() {
+        return check(ROM_SMARTISAN);
+    }
+
+    public static String getName() {
+        if (sName == null) {
+            check("");
+        }
+        return sName;
+    }
+
+    public static String getVersion() {
+        if (sVersion == null) {
+            check("");
+        }
+        return sVersion;
+    }
+
+    public static boolean check(String rom) {
+        if (sName != null) {
+            return sName.equals(rom);
+        }
+
+        if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_MIUI))) {
+            sName = ROM_MIUI;
+        } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_EMUI))) {
+            sName = ROM_EMUI;
+        } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_OPPO))) {
+            sName = ROM_OPPO;
+        } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_VIVO))) {
+            sName = ROM_VIVO;
+        } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_SMARTISAN))) {
+            sName = ROM_SMARTISAN;
+        } else {
+            sVersion = Build.DISPLAY;
+            if (sVersion.toUpperCase().contains(ROM_FLYME)) {
+                sName = ROM_FLYME;
+            } else {
+                sVersion = Build.UNKNOWN;
+                sName = Build.MANUFACTURER.toUpperCase();
+            }
+        }
+        return sName.equals(rom);
+    }
+
+    public static String getProp(String name) {
+        String line = null;
+        BufferedReader input = null;
+        try {
+            Process p = Runtime.getRuntime().exec("getprop " + name);
+            input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
+            line = input.readLine();
+            input.close();
+        } catch (IOException ex) {
+            Log.e(TAG, "Unable to read prop " + name, ex);
+            return null;
+        } finally {
+            if (input != null) {
+                try {
+                    input.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return line;
+    }
+
+}

+ 70 - 0
app/src/main/java/com/sheep/gamegroup/util/statusbar/StatusBarCompat.java

@@ -0,0 +1,70 @@
+package com.sheep.gamegroup.util.statusbar;
+
+import android.app.Activity;
+import android.os.Build;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.design.widget.AppBarLayout;
+import android.support.design.widget.CollapsingToolbarLayout;
+import android.support.v7.widget.Toolbar;
+
+/**
+ * Utils for status bar
+ * Created by qiu on 3/29/16.
+ */
+public class StatusBarCompat {
+
+    //Get alpha color
+    static int calculateStatusBarColor(int color, int alpha) {
+        float a = 1 - alpha / 255f;
+        int red = color >> 16 & 0xff;
+        int green = color >> 8 & 0xff;
+        int blue = color & 0xff;
+        red = (int) (red * a + 0.5);
+        green = (int) (green * a + 0.5);
+        blue = (int) (blue * a + 0.5);
+        return 0xff << 24 | red << 16 | green << 8 | blue;
+    }
+
+    /**
+     * set statusBarColor
+     * @param statusColor color
+     * @param alpha       0 - 255
+     */
+    public static void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor, int alpha) {
+        setStatusBarColor(activity, calculateStatusBarColor(statusColor, alpha));
+    }
+
+    public static void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            StatusBarCompatLollipop.setStatusBarColor(activity, statusColor);
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            StatusBarCompatKitKat.setStatusBarColor(activity, statusColor);
+        }
+    }
+
+    public static void translucentStatusBar(@NonNull Activity activity) {
+        translucentStatusBar(activity, false);
+    }
+
+    /**
+     * change to full screen mode
+     * @param hideStatusBarBackground hide status bar alpha Background when SDK > 21, true if hide it
+     */
+    public static void translucentStatusBar(@NonNull Activity activity, boolean hideStatusBarBackground) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            StatusBarCompatLollipop.translucentStatusBar(activity, hideStatusBarBackground);
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            StatusBarCompatKitKat.translucentStatusBar(activity);
+        }
+    }
+
+    public static void setStatusBarColorForCollapsingToolbar(@NonNull Activity activity, AppBarLayout appBarLayout, CollapsingToolbarLayout collapsingToolbarLayout,
+                                                             Toolbar toolbar, @ColorInt int statusColor) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            StatusBarCompatLollipop.setStatusBarColorForCollapsingToolbar(activity, appBarLayout, collapsingToolbarLayout, toolbar, statusColor);
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            StatusBarCompatKitKat.setStatusBarColorForCollapsingToolbar(activity, appBarLayout, collapsingToolbarLayout, toolbar, statusColor);
+        }
+    }
+}

+ 218 - 0
app/src/main/java/com/sheep/gamegroup/util/statusbar/StatusBarCompatKitKat.java

@@ -0,0 +1,218 @@
+package com.sheep.gamegroup.util.statusbar;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Context;
+import android.os.Build;
+import android.support.design.widget.AppBarLayout;
+import android.support.design.widget.CollapsingToolbarLayout;
+import android.support.design.widget.CoordinatorLayout;
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+/**
+ * After kitkat add fake status bar
+ * Created by qiu on 8/27/16.
+ */
+@TargetApi(Build.VERSION_CODES.KITKAT)
+class StatusBarCompatKitKat {
+
+    private static final String TAG_FAKE_STATUS_BAR_VIEW = "statusBarView";
+    private static final String TAG_MARGIN_ADDED = "marginAdded";
+
+    /**
+     * return statusBar's Height in pixels
+     */
+    private static int getStatusBarHeight(Context context) {
+        int result = 0;
+        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
+        if (resId > 0) {
+            result = context.getResources().getDimensionPixelOffset(resId);
+        }
+        return result;
+    }
+
+    /**
+     * 1. Add fake statusBarView.
+     * 2. set tag to statusBarView.
+     */
+    private static View addFakeStatusBarView(Activity activity, int statusBarColor, int statusBarHeight) {
+        Window window = activity.getWindow();
+        ViewGroup mDecorView = (ViewGroup) window.getDecorView();
+
+        View mStatusBarView = new View(activity);
+        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
+        layoutParams.gravity = Gravity.TOP;
+        mStatusBarView.setLayoutParams(layoutParams);
+        mStatusBarView.setBackgroundColor(statusBarColor);
+        mStatusBarView.setTag(TAG_FAKE_STATUS_BAR_VIEW);
+
+        mDecorView.addView(mStatusBarView);
+        return mStatusBarView;
+    }
+
+    /**
+     * use reserved order to remove is more quickly.
+     */
+    private static void removeFakeStatusBarViewIfExist(Activity activity) {
+        Window window = activity.getWindow();
+        ViewGroup mDecorView = (ViewGroup) window.getDecorView();
+
+        View fakeView = mDecorView.findViewWithTag(TAG_FAKE_STATUS_BAR_VIEW);
+        if (fakeView != null) {
+            mDecorView.removeView(fakeView);
+        }
+    }
+
+    /**
+     * add marginTop to simulate set FitsSystemWindow true
+     */
+    private static void addMarginTopToContentChild(View mContentChild, int statusBarHeight) {
+        if (mContentChild == null) {
+            return;
+        }
+        if (!TAG_MARGIN_ADDED.equals(mContentChild.getTag())) {
+            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentChild.getLayoutParams();
+            lp.topMargin += statusBarHeight;
+            mContentChild.setLayoutParams(lp);
+            mContentChild.setTag(TAG_MARGIN_ADDED);
+        }
+    }
+
+    /**
+     * remove marginTop to simulate set FitsSystemWindow false
+     */
+    private static void removeMarginTopOfContentChild(View mContentChild, int statusBarHeight) {
+        if (mContentChild == null) {
+            return;
+        }
+        if (TAG_MARGIN_ADDED.equals(mContentChild.getTag())) {
+            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentChild.getLayoutParams();
+            lp.topMargin -= statusBarHeight;
+            mContentChild.setLayoutParams(lp);
+            mContentChild.setTag(null);
+        }
+    }
+
+    /**
+     * set StatusBarColor
+     *
+     * 1. set Window Flag : WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+     * 2. removeFakeStatusBarViewIfExist
+     * 3. addFakeStatusBarView
+     * 4. addMarginTopToContentChild
+     * 5. cancel ContentChild's fitsSystemWindow
+     */
+    static void setStatusBarColor(Activity activity, int statusColor) {
+        Window window = activity.getWindow();
+        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
+        View mContentChild = mContentView.getChildAt(0);
+        int statusBarHeight = getStatusBarHeight(activity);
+
+        removeFakeStatusBarViewIfExist(activity);
+        addFakeStatusBarView(activity, statusColor, statusBarHeight);
+        addMarginTopToContentChild(mContentChild, statusBarHeight);
+
+        if (mContentChild != null) {
+            ViewCompat.setFitsSystemWindows(mContentChild, false);
+        }
+    }
+
+    /**
+     * translucentStatusBar
+     *
+     * 1. set Window Flag : WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+     * 2. removeFakeStatusBarViewIfExist
+     * 3. removeMarginTopOfContentChild
+     * 4. cancel ContentChild's fitsSystemWindow
+     */
+    static void translucentStatusBar(Activity activity) {
+        Window window = activity.getWindow();
+        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+        ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
+        View mContentChild = mContentView.getChildAt(0);
+
+        removeFakeStatusBarViewIfExist(activity);
+        removeMarginTopOfContentChild(mContentChild, getStatusBarHeight(activity));
+        if (mContentChild != null) {
+            ViewCompat.setFitsSystemWindows(mContentChild, false);
+        }
+    }
+
+    /**
+     * compat for CollapsingToolbarLayout
+     *
+     * 1. set Window Flag : WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+     * 2. set FitsSystemWindows for views.
+     * 3. add Toolbar's height, let it layout from top, then add paddingTop to layout normal.
+     * 4. removeFakeStatusBarViewIfExist
+     * 5. removeMarginTopOfContentChild
+     * 6. add OnOffsetChangedListener to change statusBarView's alpha
+     */
+    static void setStatusBarColorForCollapsingToolbar(Activity activity, final AppBarLayout appBarLayout, final CollapsingToolbarLayout collapsingToolbarLayout,
+                                                      Toolbar toolbar, int statusColor) {
+        Window window = activity.getWindow();
+        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
+
+        View mContentChild = mContentView.getChildAt(0);
+        mContentChild.setFitsSystemWindows(false);
+        ((View) appBarLayout.getParent()).setFitsSystemWindows(false);
+        appBarLayout.setFitsSystemWindows(false);
+        collapsingToolbarLayout.setFitsSystemWindows(false);
+        collapsingToolbarLayout.getChildAt(0).setFitsSystemWindows(false);
+
+        toolbar.setFitsSystemWindows(false);
+        if (toolbar.getTag() == null) {
+            CollapsingToolbarLayout.LayoutParams lp = (CollapsingToolbarLayout.LayoutParams) toolbar.getLayoutParams();
+            int statusBarHeight = getStatusBarHeight(activity);
+            lp.height += statusBarHeight;
+            toolbar.setLayoutParams(lp);
+            toolbar.setPadding(toolbar.getPaddingLeft(), toolbar.getPaddingTop() + statusBarHeight, toolbar.getPaddingRight(), toolbar.getPaddingBottom());
+            toolbar.setTag(true);
+        }
+
+        int statusBarHeight = getStatusBarHeight(activity);
+        removeFakeStatusBarViewIfExist(activity);
+        removeMarginTopOfContentChild(mContentChild, statusBarHeight);
+        final View statusView = addFakeStatusBarView(activity, statusColor, statusBarHeight);
+
+        CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams()).getBehavior();
+        if (behavior != null && behavior instanceof AppBarLayout.Behavior) {
+            int verticalOffset = ((AppBarLayout.Behavior) behavior).getTopAndBottomOffset();
+            if (Math.abs(verticalOffset) > appBarLayout.getHeight() - collapsingToolbarLayout.getScrimVisibleHeightTrigger()) {
+                statusView.setAlpha(1f);
+            } else {
+                statusView.setAlpha(0f);
+            }
+        } else {
+            statusView.setAlpha(0f);
+        }
+
+        appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
+            @Override
+            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
+                if (Math.abs(verticalOffset) > appBarLayout.getHeight() - collapsingToolbarLayout.getScrimVisibleHeightTrigger()) {
+                    if (statusView.getAlpha() == 0) {
+                        statusView.animate().cancel();
+                        statusView.animate().alpha(1f).setDuration(collapsingToolbarLayout.getScrimAnimationDuration()).start();
+                    }
+                } else {
+                    if (statusView.getAlpha() == 1) {
+                        statusView.animate().cancel();
+                        statusView.animate().alpha(0f).setDuration(collapsingToolbarLayout.getScrimAnimationDuration()).start();
+                    }
+                }
+            }
+        });
+    }
+}

+ 190 - 0
app/src/main/java/com/sheep/gamegroup/util/statusbar/StatusBarCompatLollipop.java

@@ -0,0 +1,190 @@
+package com.sheep.gamegroup.util.statusbar;
+
+import android.animation.ValueAnimator;
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Build;
+import android.support.design.widget.AppBarLayout;
+import android.support.design.widget.CollapsingToolbarLayout;
+import android.support.design.widget.CoordinatorLayout;
+import android.support.v4.view.OnApplyWindowInsetsListener;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.WindowInsetsCompat;
+import android.support.v7.widget.Toolbar;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+
+/**
+ * After Lollipop use system method.
+ * Created by qiu on 8/27/16.
+ */
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+class StatusBarCompatLollipop {
+
+    /**
+     * return statusBar's Height in pixels
+     */
+    private static int getStatusBarHeight(Context context) {
+        int result = 0;
+        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
+        if (resId > 0) {
+            result = context.getResources().getDimensionPixelOffset(resId);
+        }
+        return result;
+    }
+
+    /**
+     * set StatusBarColor
+     *
+     * 1. set Flags to call setStatusBarColor
+     * 2. call setSystemUiVisibility to clear translucentStatusBar's Flag.
+     * 3. set FitsSystemWindows to false
+     */
+    static void setStatusBarColor(Activity activity, int statusColor) {
+        Window window = activity.getWindow();
+
+        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+        window.setStatusBarColor(statusColor);
+        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+
+        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
+        View mChildView = mContentView.getChildAt(0);
+        if (mChildView != null) {
+            ViewCompat.setFitsSystemWindows(mChildView, false);
+            ViewCompat.requestApplyInsets(mChildView);
+        }
+    }
+
+    /**
+     * translucentStatusBar(full-screen)
+     *
+     * 1. set Flags to full-screen
+     * 2. set FitsSystemWindows to false
+     *
+     * @param hideStatusBarBackground hide statusBar's shadow
+     */
+    static void translucentStatusBar(Activity activity, boolean hideStatusBarBackground) {
+        Window window = activity.getWindow();
+
+        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+        if (hideStatusBarBackground) {
+            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+            window.setStatusBarColor(Color.TRANSPARENT);
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+        } else {
+            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+        }
+
+        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
+        View mChildView = mContentView.getChildAt(0);
+        if (mChildView != null) {
+            ViewCompat.setFitsSystemWindows(mChildView, false);
+            ViewCompat.requestApplyInsets(mChildView);
+        }
+    }
+
+    /**
+     * compat for CollapsingToolbarLayout
+     *
+     * 1. change to full-screen mode(like translucentStatusBar).
+     * 2. cancel CollapsingToolbarLayout's WindowInsets, let it layout as normal(now setStatusBarScrimColor is useless).
+     * 3. set View's FitsSystemWindow to false.
+     * 4. add Toolbar's height, let it layout from top, then add paddingTop to layout normal.
+     * 5. change statusBarColor by AppBarLayout's offset.
+     * 6. add Listener to change statusBarColor
+     */
+    static void setStatusBarColorForCollapsingToolbar(Activity activity, final AppBarLayout appBarLayout, final CollapsingToolbarLayout collapsingToolbarLayout,
+                                                      Toolbar toolbar, final int statusColor) {
+        final Window window = activity.getWindow();
+
+        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+        window.setStatusBarColor(Color.TRANSPARENT);
+        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+
+        ViewCompat.setOnApplyWindowInsetsListener(collapsingToolbarLayout, new OnApplyWindowInsetsListener() {
+            @Override
+            public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
+                return insets;
+            }
+        });
+
+        ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
+        View mChildView = mContentView.getChildAt(0);
+        if (mChildView != null) {
+            ViewCompat.setFitsSystemWindows(mChildView, false);
+            ViewCompat.requestApplyInsets(mChildView);
+        }
+
+        ((View) appBarLayout.getParent()).setFitsSystemWindows(false);
+        appBarLayout.setFitsSystemWindows(false);
+
+        toolbar.setFitsSystemWindows(false);
+        if (toolbar.getTag() == null) {
+            CollapsingToolbarLayout.LayoutParams lp = (CollapsingToolbarLayout.LayoutParams) toolbar.getLayoutParams();
+            int statusBarHeight = getStatusBarHeight(activity);
+            lp.height += statusBarHeight;
+            toolbar.setLayoutParams(lp);
+            toolbar.setPadding(toolbar.getPaddingLeft(), toolbar.getPaddingTop() + statusBarHeight, toolbar.getPaddingRight(), toolbar.getPaddingBottom());
+            toolbar.setTag(true);
+        }
+
+        CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams()).getBehavior();
+        if (behavior != null && behavior instanceof AppBarLayout.Behavior) {
+            int verticalOffset = ((AppBarLayout.Behavior) behavior).getTopAndBottomOffset();
+            if (Math.abs(verticalOffset) > appBarLayout.getHeight() - collapsingToolbarLayout.getScrimVisibleHeightTrigger()) {
+                window.setStatusBarColor(statusColor);
+            } else {
+                window.setStatusBarColor(Color.TRANSPARENT);
+            }
+        } else {
+            window.setStatusBarColor(Color.TRANSPARENT);
+        }
+
+        collapsingToolbarLayout.setFitsSystemWindows(false);
+        appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
+            @Override
+            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
+                if (Math.abs(verticalOffset) > appBarLayout.getHeight() - collapsingToolbarLayout.getScrimVisibleHeightTrigger()) {
+                    if (window.getStatusBarColor() != statusColor) {
+                        startColorAnimation(window.getStatusBarColor(), statusColor, collapsingToolbarLayout.getScrimAnimationDuration(), window);
+                    }
+                } else {
+                    if (window.getStatusBarColor() != Color.TRANSPARENT) {
+                        startColorAnimation(window.getStatusBarColor(), Color.TRANSPARENT, collapsingToolbarLayout.getScrimAnimationDuration(), window);
+                    }
+                }
+            }
+        });
+        collapsingToolbarLayout.getChildAt(0).setFitsSystemWindows(false);
+        collapsingToolbarLayout.setStatusBarScrimColor(statusColor);
+    }
+
+    /**
+     * use ValueAnimator to change statusBarColor when using collapsingToolbarLayout
+     */
+    static void startColorAnimation(int startColor, int endColor, long duration, final Window window) {
+        if (sAnimator != null) {
+            sAnimator.cancel();
+        }
+        sAnimator = ValueAnimator.ofArgb(startColor, endColor)
+                .setDuration(duration);
+        sAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator valueAnimator) {
+                if (window != null) {
+                    window.setStatusBarColor((Integer) valueAnimator.getAnimatedValue());
+                }
+            }
+        });
+        sAnimator.start();
+    }
+
+    private static ValueAnimator sAnimator;
+}

+ 159 - 0
app/src/main/java/com/sheep/gamegroup/util/statusbar/StatusBarUtil.java

@@ -0,0 +1,159 @@
+package com.sheep.gamegroup.util.statusbar;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Build;
+import android.support.annotation.IntDef;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+public class StatusBarUtil {
+
+    public final static int TYPE_MIUI = 0;
+    public final static int TYPE_FLYME = 1;
+    public final static int TYPE_M = 3;//6.0
+
+    @IntDef({TYPE_MIUI,
+            TYPE_FLYME,
+            TYPE_M})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface ViewType {
+    }
+
+    /**
+     * 修改状态栏颜色,支持4.4以上版本
+     *
+     * @param colorId 颜色
+     */
+    public static void setStatusBarColor(Activity activity, int colorId) {
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            Window window = activity.getWindow();
+            window.setStatusBarColor(colorId);
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            //使用SystemBarTintManager,需要先将状态栏设置为透明
+            setTranslucentStatus(activity);
+            SystemBarTintManager systemBarTintManager = new SystemBarTintManager(activity);
+            systemBarTintManager.setStatusBarTintEnabled(true);//显示状态栏
+            systemBarTintManager.setStatusBarTintColor(colorId);//设置状态栏颜色
+        }
+    }
+
+    /**
+     * 设置状态栏透明
+     */
+    @TargetApi(19)
+    public static void setTranslucentStatus(Activity activity) {
+
+        // 5.0以上系统状态栏透明
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            Window window = activity.getWindow();
+            //清除透明状态栏
+            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+            //设置状态栏颜色必须添加
+            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+            window.setStatusBarColor(Color.TRANSPARENT);//设置透明
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //19
+            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+        }
+    }
+
+    /**
+     * 设置沉浸式状态栏
+     *
+     * @param fontIconDark 状态栏字体和图标颜色是否为深色
+     */
+    public static void setImmersiveStatusBar(Activity activity, boolean fontIconDark) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            setStatusBarFontIconDark(activity, TYPE_M, fontIconDark);
+        } else if (OSUtils.isMiui()) {
+            setStatusBarFontIconDark(activity, TYPE_MIUI, fontIconDark);
+        } else if (OSUtils.isFlyme()) {
+            setStatusBarFontIconDark(activity, TYPE_FLYME, fontIconDark);
+        } else if (OSUtils.isOppo()) {
+            StatusBarUtil.setStatusBarColor(activity, 0x50000000);
+        } else if (OSUtils.isVivo()) {
+            StatusBarUtil.setStatusBarColor(activity, 0x50000000);
+        } else {//其他情况下我们将状态栏设置为灰色,就不会看不见字体
+            setStatusBarColor(activity, Color.LTGRAY);//灰色
+        }
+    }
+
+    /**
+     * 设置文字颜色
+     */
+    public static void setStatusBarFontIconDark(Activity activity, @ViewType int type, boolean isDark) {
+        switch (type) {
+            case TYPE_MIUI:
+                setMiuiUI(activity, isDark);
+                break;
+            case TYPE_M:
+                setCommonUI(activity, isDark);
+                break;
+            case TYPE_FLYME:
+                setFlymeUI(activity, isDark);
+                break;
+        }
+    }
+
+    //设置6.0的字体
+    public static void setCommonUI(Activity activity, boolean dark) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            activity.getWindow().getDecorView().setSystemUiVisibility(
+                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                            | (dark ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : View.SYSTEM_UI_FLAG_VISIBLE));
+        }
+    }
+
+    //设置Flyme的字体
+    public static void setFlymeUI(Activity activity, boolean dark) {
+        try {
+            Window window = activity.getWindow();
+            WindowManager.LayoutParams lp = window.getAttributes();
+            Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
+            Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
+            darkFlag.setAccessible(true);
+            meizuFlags.setAccessible(true);
+            int bit = darkFlag.getInt(null);
+            int value = meizuFlags.getInt(lp);
+            if (dark) {
+                value |= bit;
+            } else {
+                value &= ~bit;
+            }
+            meizuFlags.setInt(lp, value);
+            window.setAttributes(lp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    //设置MIUI字体
+    public static void setMiuiUI(Activity activity, boolean dark) {
+        try {
+            Window window = activity.getWindow();
+            Class clazz = activity.getWindow().getClass();
+            Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
+            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
+            int darkModeFlag = field.getInt(layoutParams);
+            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
+            if (dark) {    //状态栏亮色且黑色字体
+                extraFlagField.invoke(window, darkModeFlag, darkModeFlag);
+            } else {
+                extraFlagField.invoke(window, 0, darkModeFlag);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 103 - 0
app/src/main/java/com/sheep/gamegroup/util/statusbar/SystemBarTintManager.java

@@ -0,0 +1,103 @@
+package com.sheep.gamegroup.util.statusbar;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+public class SystemBarTintManager {
+
+    public static final int DEFAULT_TINT_COLOR = 0x99000000;
+    private boolean mStatusBarAvailable;
+    private boolean mStatusBarTintEnabled;
+    private View mStatusBarTintView;
+
+    @TargetApi(19)
+    public SystemBarTintManager(Activity activity) {
+
+        Window win = activity.getWindow();
+        //获取DecorView
+        ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            // 检查主题中是否有透明的状态栏
+            int[] attrs = {android.R.attr.windowTranslucentStatus};
+            TypedArray a = activity.obtainStyledAttributes(attrs);
+            try {
+                mStatusBarAvailable = a.getBoolean(0, false);
+            } finally {
+                a.recycle();
+            }
+            WindowManager.LayoutParams winParams = win.getAttributes();
+            int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;//状态栏透明
+            if ((winParams.flags & bits) != 0) {
+                mStatusBarAvailable = true;
+            }
+        }
+        if (mStatusBarAvailable) {
+            setupStatusBarView(activity, decorViewGroup);
+        }
+    }
+
+    /**
+     * 初始化状态栏
+     *
+     * @param context
+     * @param decorViewGroup
+     */
+    private void setupStatusBarView(Activity context, ViewGroup decorViewGroup) {
+        mStatusBarTintView = new View(context);
+        //设置高度为Statusbar的高度
+        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));
+        params.gravity = Gravity.TOP;
+        mStatusBarTintView.setLayoutParams(params);
+        mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
+        //默认不显示
+        mStatusBarTintView.setVisibility(View.GONE);
+        //decorView添加状态栏高度的View
+        decorViewGroup.addView(mStatusBarTintView);
+    }
+
+    /**
+     * 获取状态栏高度
+     *
+     * @param activity
+     * @return
+     */
+    private int getStatusBarHeight(Activity activity) {
+        int statusBarHeight = 0;
+        int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
+        if (resourceId > 0) {
+            statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
+        }
+        return statusBarHeight;
+    }
+
+    /**
+     * 显示状态栏
+     */
+    public void setStatusBarTintEnabled(boolean enabled) {
+        mStatusBarTintEnabled = enabled;
+        if (mStatusBarAvailable) {
+            mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);
+        }
+    }
+
+    /**
+     * 设置状态栏颜色
+     *
+     * @param color
+     */
+    public void setStatusBarTintColor(int color) {
+        if (mStatusBarAvailable) {
+            mStatusBarTintView.setBackgroundColor(color);
+        }
+    }
+
+}

+ 5 - 21
app/src/main/java/com/sheep/gamegroup/view/activity/ActMain.java

@@ -1,6 +1,7 @@
 package com.sheep.gamegroup.view.activity;
 
 import android.content.Intent;
+import android.graphics.Color;
 import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
@@ -39,6 +40,8 @@ import com.sheep.gamegroup.util.SysAppUtil;
 import com.sheep.gamegroup.util.TestUtil;
 import com.sheep.gamegroup.util.UMConfigUtils;
 import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.gamegroup.util.statusbar.StatusBarCompat;
+import com.sheep.gamegroup.util.statusbar.StatusBarUtil;
 import com.sheep.gamegroup.util.viewHelper.LayoutParamsUtil;
 import com.sheep.gamegroup.view.dialog.DialogGameOrTaskOrGift;
 import com.sheep.gamegroup.view.fragment.FgtPersonalCenter;
@@ -109,27 +112,8 @@ public class ActMain extends BaseActYmPermissionCheck {
     }
 
     private void setSystemUiVisibility(boolean isDark) {
-        int flag =
-                View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
-//                    View.SYSTEM_UI_FLAG_VISIBLE;
-//                    View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
-        //判断当前版本在4.0以上并且存在虚拟按键,否则不做操作
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && G.checkDeviceHasNavigationBar(this)) {
-            //一定要判断是否存在按键,否则在没有按键的手机调用会影响别的功能。如之前没有考虑到,导致图传全屏变成小屏显示。
-//             if (isDark) {
-//                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//黑色
-//             } else {
-//                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);//白色
-//             }
-            flag |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
-            flag |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
-                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
-                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | // hide
-//                    View.SYSTEM_UI_FLAG_FULLSCREEN | // hide status bar
-                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
-        }
-        // 获取属性
-        getWindow().getDecorView().setSystemUiVisibility(flag);
+        StatusBarUtil.setStatusBarColor(this, Color.TRANSPARENT);
+        StatusBarUtil.setImmersiveStatusBar(this, isDark);
     }
 
     @Override

+ 0 - 13
app/src/main/java/com/sheep/gamegroup/view/activity/ActPay.java

@@ -81,19 +81,6 @@ public class ActPay extends BaseActivity {
 
     }
 
-    private String checkToken() {
-        if (TextUtils.isEmpty(token)) {
-            return "";
-        } else {
-            String tokenPrev = DataUtil.getInstance().getUserId() + "@";
-            if (token.startsWith(tokenPrev)) {
-                return SpUtils.getToken(this);
-            } else {
-                return "";
-            }
-        }
-    }
-
     @Override
     public void initData() {
         Intent intent = getIntent();