diff --git a/app/src/main/assets/lottie/slide_guide.json b/app/src/main/assets/lottie/slide_guide.json index 304c90ca4b..d767c5e745 100644 --- a/app/src/main/assets/lottie/slide_guide.json +++ b/app/src/main/assets/lottie/slide_guide.json @@ -1 +1 @@ -{"v":"5.5.9","fr":60,"ip":0,"op":120,"w":1080,"h":586,"nm":"上滑","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"手","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.642],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.558],"y":[0]},"t":60,"s":[100]},{"t":71,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.479,"y":0},"t":3,"s":[611,475,0],"to":[0,-62.75,0],"ti":[0,62.75,0]},{"t":40,"s":[611,98.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.78,-12.06],[5.68,0.39],[-6.42,-2.45],[-6.32,-0.97],[-5.95,13.55],[4.87,7.91],[4.94,6.69],[1.26,-5.37],[5.25,-1.25],[1.5,-0.3],[3.4,-0.77],[1.4,1.68],[6.15,7.98],[-1.73,-6.64]],"o":[[1.62,2.49],[-5.68,-0.39],[9.37,3.63],[6.31,0.98],[2.39,-7.74],[-4.87,-7.92],[-2.45,-3.05],[-1.05,4.57],[-4.99,1.39],[-0.83,0.13],[-5.63,1.63],[-4.71,-5.72],[-2.75,-3.31],[3.52,6.76]],"v":[[-7.86,14.26],[-15.64,12.52],[-17.99,22.89],[8.47,31.78],[33.98,17.29],[29.55,-1.59],[16.85,-20.15],[7.86,-17.83],[1.56,-19.8],[-3.05,-14.02],[-8.33,-16.94],[-12.44,-11.045],[-26.761,-30.19],[-34.75,-25.78]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"矩形","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.715],"y":[0]},"t":57,"s":[100]},{"t":67,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[525,228.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.491,"y":0},"t":3,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[24.328,180.5],[-22,180.5],[-22,204.5],[24.328,204.5]],"c":true}]},{"t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[24.328,-207.5],[-22,-207.5],[-22,204.5],[24.328,204.5]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"蒙版 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6,137],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":9}},"s":{"a":0,"k":[0,-68.5],"ix":5},"e":{"a":0,"k":[0,68.5],"ix":6},"t":1,"nm":"渐变填充 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":33,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":3,"op":123,"st":3,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.5.9","fr":60,"ip":0,"op":120,"w":1080,"h":586,"nm":"上滑","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"手","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.642],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.558],"y":[0]},"t":60,"s":[100]},{"t":71,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.479,"y":0},"t":3,"s":[611,475,0],"to":[0,-62.75,0],"ti":[0,62.75,0]},{"t":40,"s":[611,98.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.78,-12.06],[5.68,0.39],[-6.42,-2.45],[-6.32,-0.97],[-5.95,13.55],[4.87,7.91],[4.94,6.69],[1.26,-5.37],[5.25,-1.25],[1.5,-0.3],[3.4,-0.77],[1.4,1.68],[6.15,7.98],[-1.73,-6.64]],"o":[[1.62,2.49],[-5.68,-0.39],[9.37,3.63],[6.31,0.98],[2.39,-7.74],[-4.87,-7.92],[-2.45,-3.05],[-1.05,4.57],[-4.99,1.39],[-0.83,0.13],[-5.63,1.63],[-4.71,-5.72],[-2.75,-3.31],[3.52,6.76]],"v":[[-7.86,14.26],[-15.64,12.52],[-17.99,22.89],[8.47,31.78],[33.98,17.29],[29.55,-1.59],[16.85,-20.15],[7.86,-17.83],[1.56,-19.8],[-3.05,-14.02],[-8.33,-16.94],[-12.44,-11.045],[-26.761,-30.19],[-34.75,-25.78]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"矩形","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.715],"y":[0]},"t":57,"s":[100]},{"t":67,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[525,228.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.491,"y":0},"t":3,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[24.328,180.5],[-22,180.5],[-22,204.5],[24.328,204.5]],"c":true}]},{"t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[24.328,-207.5],[-22,-207.5],[-22,204.5],[24.328,204.5]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"蒙版 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6,137],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1,0,1,0.5,0.5,1,0],"ix":9}},"s":{"a":0,"k":[0,-68.5],"ix":5},"e":{"a":0,"k":[0,68.5],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":33,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":3,"op":123,"st":3,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/im/ImHintView.kt b/app/src/main/java/com/gh/common/im/ImHintView.kt index 688c9537e4..9f77abf716 100644 --- a/app/src/main/java/com/gh/common/im/ImHintView.kt +++ b/app/src/main/java/com/gh/common/im/ImHintView.kt @@ -2,16 +2,12 @@ package com.gh.common.im import android.app.Activity import android.content.Context -import android.os.Build -import androidx.core.view.ViewCompat import android.util.AttributeSet -import android.util.DisplayMetrics import android.util.TypedValue -import android.view.KeyCharacterMap -import android.view.KeyEvent import android.view.View -import android.view.ViewConfiguration import android.widget.RelativeLayout +import androidx.core.view.ViewCompat +import com.gh.common.util.DisplayUtils import com.gh.gamecenter.R import kotlinx.android.synthetic.main.view_im_hint.view.* @@ -32,7 +28,7 @@ class ImHintView @JvmOverloads constructor(context: Context, attrs: AttributeSet val lp = ivContainer.layoutParams as RelativeLayout.LayoutParams - lp.setMargins(0, 0, dp2px(30f), dp2px(106f) + retrieveNavigationHeight()) + lp.setMargins(0, 0, dp2px(30f), dp2px(106f) + DisplayUtils.retrieveNavigationHeight(context)) } fun showDot(show: Boolean) { @@ -46,39 +42,4 @@ class ImHintView @JvmOverloads constructor(context: Context, attrs: AttributeSet private fun dp2px(dp: Float): Int { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.applicationContext.resources.displayMetrics).toInt() } - - private fun hasSoftKeys(): Boolean { - if (context !is Activity) return false - - val hasSoftwareKeys: Boolean - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - val d = (context as Activity).windowManager.defaultDisplay - - val realDisplayMetrics = DisplayMetrics() - d.getRealMetrics(realDisplayMetrics) - - val realHeight = realDisplayMetrics.heightPixels - val realWidth = realDisplayMetrics.widthPixels - - val displayMetrics = DisplayMetrics() - d.getMetrics(displayMetrics) - - val displayHeight = displayMetrics.heightPixels - val displayWidth = displayMetrics.widthPixels - - hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0 - } else { - val hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey() - val hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK) - hasSoftwareKeys = !hasMenuKey && !hasBackKey - } - return hasSoftwareKeys - } - - private fun retrieveNavigationHeight(): Int { - val resources = context.resources - val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") - return if (resourceId > 0 && hasSoftKeys()) resources.getDimensionPixelSize(resourceId) else 0 - } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/notifier/NotifierView.kt b/app/src/main/java/com/gh/common/notifier/NotifierView.kt index d410f287b3..ac213debb9 100644 --- a/app/src/main/java/com/gh/common/notifier/NotifierView.kt +++ b/app/src/main/java/com/gh/common/notifier/NotifierView.kt @@ -1,18 +1,19 @@ package com.gh.common.notifier import android.animation.* -import android.app.Activity import android.content.Context import android.graphics.Path -import android.os.Build import android.text.TextUtils import android.util.AttributeSet -import android.util.DisplayMetrics import android.util.Log import android.util.TypedValue -import android.view.* +import android.view.Gravity +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup import android.widget.FrameLayout import androidx.core.view.ViewCompat +import com.gh.common.util.DisplayUtils import com.gh.common.util.ImageUtils import com.gh.common.util.doOnEnd import com.gh.common.util.doOnStart @@ -74,7 +75,7 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS verticalAnimationOffset = dp2px(100F) - navigationHeight = retrieveNavigationHeight() + navigationHeight = DisplayUtils.retrieveNavigationHeight(context) rightToLeftPath = Path() leftToRightPath = Path() @@ -290,41 +291,6 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.applicationContext.resources.displayMetrics).toInt() } - private fun hasSoftKeys(): Boolean { - if (context !is Activity) return false - - val hasSoftwareKeys: Boolean - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - val d = (context as Activity).windowManager.defaultDisplay - - val realDisplayMetrics = DisplayMetrics() - d.getRealMetrics(realDisplayMetrics) - - val realHeight = realDisplayMetrics.heightPixels - val realWidth = realDisplayMetrics.widthPixels - - val displayMetrics = DisplayMetrics() - d.getMetrics(displayMetrics) - - val displayHeight = displayMetrics.heightPixels - val displayWidth = displayMetrics.widthPixels - - hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0 - } else { - val hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey() - val hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK) - hasSoftwareKeys = !hasMenuKey && !hasBackKey - } - return hasSoftwareKeys - } - - private fun retrieveNavigationHeight(): Int { - val resources = context.resources - val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") - return if (resourceId > 0 && hasSoftKeys()) resources.getDimensionPixelSize(resourceId) else 0 - } - interface OnShowNotificationListener { fun onShow() } diff --git a/app/src/main/java/com/gh/common/util/DisplayUtils.java b/app/src/main/java/com/gh/common/util/DisplayUtils.java index a3a0de03d2..484ed91fff 100644 --- a/app/src/main/java/com/gh/common/util/DisplayUtils.java +++ b/app/src/main/java/com/gh/common/util/DisplayUtils.java @@ -5,7 +5,12 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.os.Build; +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.Window; import android.view.WindowManager; @@ -17,7 +22,7 @@ import java.lang.reflect.Method; import androidx.core.content.ContextCompat; public class DisplayUtils { - + /** * 根据手机的分辨率从 dip(像素) 的单位 转成为 px */ @@ -25,7 +30,7 @@ public class DisplayUtils { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } - + /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dip */ @@ -33,19 +38,19 @@ public class DisplayUtils { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } - + /** * 根据手机的分辨率从 dip(像素) 的单位 转成为 px */ public static int dip2px(float dpValue) { final float scale = HaloApp.getInstance() - .getApplication() - .getResources() - .getDisplayMetrics().density; + .getApplication() + .getResources() + .getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } - - + + /** * 将px值转换为sp值,保证文字大小不变 * @@ -57,7 +62,7 @@ public class DisplayUtils { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } - + /** * 将sp值转换为px值,保证文字大小不变 * @@ -69,7 +74,7 @@ public class DisplayUtils { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } - + /** * 获取状态栏的高度 * @@ -79,7 +84,7 @@ public class DisplayUtils { public static int getStatusBarHeight(Resources resources) { return getInternalDimensionSize(resources, "status_bar_height"); } - + public static int getInternalDimensionSize(Resources res, String key) { int result = 0; int resourceId = res.getIdentifier(key, "dimen", "android"); @@ -88,7 +93,7 @@ public class DisplayUtils { } return result; } - + public static void transparentStatusBar(Activity activity) { //make full transparent statusBar if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) { @@ -96,15 +101,15 @@ public class DisplayUtils { } if (Build.VERSION.SDK_INT >= 19) { activity.getWindow() - .getDecorView() - .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + .getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } if (Build.VERSION.SDK_INT >= 21) { setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false); activity.getWindow().setStatusBarColor(Color.TRANSPARENT); } } - + public static void transparentStatusAndNavigation(Activity activity) { //make full transparent statusBar if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) { @@ -112,8 +117,8 @@ public class DisplayUtils { } if (Build.VERSION.SDK_INT >= 19) { activity.getWindow() - .getDecorView() - .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + .getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } if (Build.VERSION.SDK_INT >= 21) { setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false); @@ -121,7 +126,7 @@ public class DisplayUtils { activity.getWindow().setNavigationBarColor(Color.TRANSPARENT); } } - + private static void setWindowFlag(Activity activity, final int bits, boolean on) { Window win = activity.getWindow(); WindowManager.LayoutParams winParams = win.getAttributes(); @@ -132,14 +137,14 @@ public class DisplayUtils { } win.setAttributes(winParams); } - + public static void setLightStatusBar(Activity activity, boolean lightStatusBar) { boolean isMIUI = setMIUIStatusBarStyle(activity, lightStatusBar); - + if (!isMIUI) { Window window = activity.getWindow(); View decor = window.getDecorView(); - + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (lightStatusBar) { decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); @@ -151,7 +156,7 @@ public class DisplayUtils { } } } - + private static boolean setMIUIStatusBarStyle(Activity activity, boolean lightStatusBar) { boolean result = false; Window window = activity.getWindow(); @@ -165,12 +170,12 @@ public class DisplayUtils { Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(window, lightStatusBar ? darkModeFlag : 0, darkModeFlag);//状态栏透明且黑色字体 result = true; - + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && lightStatusBar) { //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上 activity.getWindow() - .getDecorView() - .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + .getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } } catch (Exception e) { // do nothing @@ -179,16 +184,51 @@ public class DisplayUtils { return result; } - public static void setStatusBarColor(Activity activity, int color, boolean lightStatusBar) { + public static void setStatusBarColor(Activity activity, int color, boolean lightStatusBar) { Window window = activity.getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - window.setStatusBarColor(ContextCompat.getColor(activity,color)); + window.setStatusBarColor(ContextCompat.getColor(activity, color)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - setLightStatusBar(activity,lightStatusBar); + setLightStatusBar(activity, lightStatusBar); } } - + + public static int retrieveNavigationHeight(Context context) { + Resources resources = context.getResources(); + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + return (resourceId > 0 && hasSoftKeys(context)) ? resources.getDimensionPixelSize(resourceId) : 0; + } + + private static boolean hasSoftKeys(Context context) { + if (!(context instanceof Activity)) return false; + + boolean hasSoftwareKeys; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Display d = ((Activity) context).getWindowManager().getDefaultDisplay(); + + DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + d.getRealMetrics(realDisplayMetrics); + + int realHeight = realDisplayMetrics.heightPixels; + int realWidth = realDisplayMetrics.widthPixels; + + DisplayMetrics displayMetrics = new DisplayMetrics(); + d.getMetrics(displayMetrics); + + int displayHeight = displayMetrics.heightPixels; + int displayWidth = displayMetrics.widthPixels; + + hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0; + } else { + boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey(); + boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); + hasSoftwareKeys = !hasMenuKey && !hasBackKey; + } + return hasSoftwareKeys; + } + } diff --git a/app/src/main/java/com/gh/common/view/NavigationBarView.kt b/app/src/main/java/com/gh/common/view/NavigationBarView.kt index 35461f8f1e..31667cb988 100644 --- a/app/src/main/java/com/gh/common/view/NavigationBarView.kt +++ b/app/src/main/java/com/gh/common/view/NavigationBarView.kt @@ -1,14 +1,10 @@ package com.gh.common.view -import android.app.Activity import android.content.Context import android.os.Build import android.util.AttributeSet -import android.util.DisplayMetrics -import android.view.KeyCharacterMap -import android.view.KeyEvent import android.view.View -import android.view.ViewConfiguration +import com.gh.common.util.DisplayUtils /** * 导航栏占位 View @@ -18,44 +14,8 @@ class NavigationBarView @JvmOverloads constructor(context: Context?, attrs: Attr val height = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 0 } else { - retrieveNavigationHeight() + DisplayUtils.retrieveNavigationHeight(context) } setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), height) } - - // TODO 将这部分移到通用方法去 - private fun hasSoftKeys(): Boolean { - if (context !is Activity) return false - - val hasSoftwareKeys: Boolean - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - val d = (context as Activity).windowManager.defaultDisplay - - val realDisplayMetrics = DisplayMetrics() - d.getRealMetrics(realDisplayMetrics) - - val realHeight = realDisplayMetrics.heightPixels - val realWidth = realDisplayMetrics.widthPixels - - val displayMetrics = DisplayMetrics() - d.getMetrics(displayMetrics) - - val displayHeight = displayMetrics.heightPixels - val displayWidth = displayMetrics.widthPixels - - hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0 - } else { - val hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey() - val hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK) - hasSoftwareKeys = !hasMenuKey && !hasBackKey - } - return hasSoftwareKeys - } - - private fun retrieveNavigationHeight(): Int { - val resources = context.resources - val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") - return if (resourceId > 0 && hasSoftKeys()) resources.getDimensionPixelSize(resourceId) else 0 - } } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt index 77ab031d76..4ecd9724c8 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt @@ -3,6 +3,7 @@ package com.gh.gamecenter.video.detail import android.app.Activity import android.content.Intent import android.graphics.drawable.ColorDrawable +import android.os.Build import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater @@ -13,7 +14,6 @@ import android.widget.RelativeLayout import android.widget.TextView import androidx.recyclerview.widget.OrientationHelper import androidx.recyclerview.widget.RecyclerView -import com.gh.common.constant.Constants import com.gh.common.util.* import com.gh.common.view.vertical_recycler.OnPagerListener import com.gh.common.view.vertical_recycler.PagerLayoutManager @@ -166,12 +166,12 @@ class VideoDetailContainerFragment : NormalFragment(), OnBackPressedListener { val uuid = (context as VideoDetailActivity).uuid smartRefreshLayout.isEnableLoadMore = isBottom smartRefreshLayout.setNoMoreData(isBottom) - val isShowClick = SPUtils.getBoolean(Constants.SP_SHOW_CLICK_GUIDE) - if (!isShowClick) { - showClickGuide() - } - SPUtils.setBoolean(Constants.SP_SHOW_SLIDE_GUIDE, true) - SPUtils.setBoolean(Constants.SP_SHOW_CLICK_GUIDE, true) +// val isShowClick = SPUtils.getBoolean(Constants.SP_SHOW_CLICK_GUIDE) +// if (!isShowClick) { + showClickGuide() +// } +// SPUtils.setBoolean(Constants.SP_SHOW_SLIDE_GUIDE, true) +// SPUtils.setBoolean(Constants.SP_SHOW_CLICK_GUIDE, true) val pos = mViewPagerLayoutManager.findFirstCompletelyVisibleItemPosition() @@ -229,10 +229,10 @@ class VideoDetailContainerFragment : NormalFragment(), OnBackPressedListener { marquee_ad_title.isSelected = true mAdCountDownTimer = startTimer(20) - val isShowSlide = SPUtils.getBoolean(Constants.SP_SHOW_SLIDE_GUIDE) - if (!isShowSlide) { - showSlideGuide() - } +// val isShowSlide = SPUtils.getBoolean(Constants.SP_SHOW_SLIDE_GUIDE) +// if (!isShowSlide) { + showSlideGuide() +// } } private fun initListener() { @@ -266,15 +266,24 @@ class VideoDetailContainerFragment : NormalFragment(), OnBackPressedListener { val layoutParams = slideGuideAnimation.layoutParams as RelativeLayout.LayoutParams layoutParams.height = DisplayUtils.dip2px(195f) - layoutParams.bottomMargin = DisplayUtils.dip2px(230f) + layoutParams.bottomMargin = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + DisplayUtils.dip2px(230f) + DisplayUtils.retrieveNavigationHeight(requireActivity()) + } else { + DisplayUtils.dip2px(230f) + } slideGuideAnimation.layoutParams = layoutParams val guideTitleLayoutParams = guideTitle.layoutParams as RelativeLayout.LayoutParams - guideTitleLayoutParams.bottomMargin = heightPixels - gameTitleY + DisplayUtils.dip2px(50f) + guideTitleLayoutParams.bottomMargin = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + heightPixels - gameTitleY + DisplayUtils.dip2px(50f) + DisplayUtils.retrieveNavigationHeight(requireActivity()) + } else { + heightPixels - gameTitleY + DisplayUtils.dip2px(50f) + } guideTitle.gravity = Gravity.CENTER guideTitle.layoutParams = guideTitleLayoutParams slideGuideAnimation.setAnimation("lottie/slide_guide.json") + slideGuideAnimation.imageAssetsFolder = "lottie/" slideGuideAnimation.playAnimation() slideGuideAnimation.doOnAnimationEnd { guideRl.visibility = View.GONE @@ -292,11 +301,22 @@ class VideoDetailContainerFragment : NormalFragment(), OnBackPressedListener { val layoutParams = slideGuideAnimation.layoutParams as RelativeLayout.LayoutParams layoutParams.height = DisplayUtils.dip2px(68f) - layoutParams.bottomMargin = heightPixels - gameTitleY - DisplayUtils.dip2px(68f) * 2 / 3 - DisplayUtils.dip2px(10f) + + val bottomMargin = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + heightPixels - gameTitleY - DisplayUtils.dip2px(68f) * 2 / 3 - DisplayUtils.dip2px(10f) + DisplayUtils.retrieveNavigationHeight(requireActivity()) + } else { + heightPixels - gameTitleY - DisplayUtils.dip2px(68f) * 2 / 3 - DisplayUtils.dip2px(10f) + } + layoutParams.bottomMargin = bottomMargin slideGuideAnimation.layoutParams = layoutParams val guideTitleLayoutParams = guideTitle.layoutParams as RelativeLayout.LayoutParams - guideTitleLayoutParams.bottomMargin = heightPixels - gameTitleY + DisplayUtils.dip2px(30f) + val guideTitleBottomMargin = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + heightPixels - gameTitleY + DisplayUtils.dip2px(30f) + DisplayUtils.retrieveNavigationHeight(requireActivity()) + } else { + heightPixels - gameTitleY + DisplayUtils.dip2px(30f) + } + guideTitleLayoutParams.bottomMargin = guideTitleBottomMargin guideTitle.gravity = Gravity.LEFT guideTitle.layoutParams = guideTitleLayoutParams