From 0777ca90e0a3ddc67e84af81fcd90adbb11dd852 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 24 Jul 2018 18:00:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E6=B6=88=E6=81=AF=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=BC=B9=E7=AA=97=E5=9C=A8=E4=BD=BF=E7=94=A8=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E6=8C=89=E9=94=AE=E7=9A=84=E8=AE=BE=E5=A4=87=E4=B8=8A?= =?UTF-8?q?=E7=9A=84=E4=BD=8D=E7=BD=AE=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GHActivityLifecycleCallbacksImpl.java | 7 +- .../java/com/gh/common/notifier/Notifier.kt | 14 ++-- .../com/gh/common/notifier/NotifierView.kt | 71 +++++++++++++++++-- .../fragment/MainWrapperFragment.java | 7 +- 4 files changed, 81 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/gh/base/GHActivityLifecycleCallbacksImpl.java b/app/src/main/java/com/gh/base/GHActivityLifecycleCallbacksImpl.java index 3a3a880139..448cf4aa85 100644 --- a/app/src/main/java/com/gh/base/GHActivityLifecycleCallbacksImpl.java +++ b/app/src/main/java/com/gh/base/GHActivityLifecycleCallbacksImpl.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.app.Application.ActivityLifecycleCallbacks; import android.os.Bundle; +import com.gh.common.notifier.Notifier; import com.gh.common.util.DataUtils; import com.gh.download.DownloadManager; import com.lightgame.utils.AppManager; @@ -27,13 +28,14 @@ public class GHActivityLifecycleCallbacksImpl implements ActivityLifecycleCallba @Override public void onActivityStarted(Activity activity) { - CurrentActivityHolder.getActivitySet().add(activity); + } @Override public void onActivityResumed(Activity activity) { DataUtils.onResume(activity); + CurrentActivityHolder.getActivitySet().add(activity); //FIXME 这里应该只是部分Activity需要 try { // 初始化gameMap @@ -46,11 +48,12 @@ public class GHActivityLifecycleCallbacksImpl implements ActivityLifecycleCallba @Override public void onActivityPaused(Activity activity) { DataUtils.onPause(activity); + CurrentActivityHolder.getActivitySet().remove(activity); } @Override public void onActivityStopped(Activity activity) { - CurrentActivityHolder.getActivitySet().remove(activity); + Notifier.hide(); } @Override diff --git a/app/src/main/java/com/gh/common/notifier/Notifier.kt b/app/src/main/java/com/gh/common/notifier/Notifier.kt index 3f62591554..4eb81db438 100644 --- a/app/src/main/java/com/gh/common/notifier/Notifier.kt +++ b/app/src/main/java/com/gh/common/notifier/Notifier.kt @@ -31,17 +31,19 @@ class Notifier private constructor() { } @JvmStatic - fun isNotifierShowing(activity: Activity?): Boolean { - (checkNotNull(activity).window?.decorView as? ViewGroup)?.let { + fun isNotExistInActivity(activity: Activity?): Boolean { + if (activity == null) return false + + (activity.window?.decorView as? ViewGroup)?.let { //Find all NotifierView Views in Parent layout for (i in 0..it.childCount) { val childView = if (it.getChildAt(i) is NotifierView) it.getChildAt(i) as NotifierView else null if (childView != null && childView.windowToken != null) { - return true + return false } } } - return false + return true } /** @@ -64,9 +66,7 @@ class Notifier private constructor() { @JvmStatic fun hide() { - activityWeakReference?.get()?.let { - clearCurrent(it) - } + activityWeakReference?.get()?.let { clearCurrent(it) } } private fun getRemoveViewRunnable(childView: NotifierView?): Runnable { 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 91c2191da1..5cffd21276 100644 --- a/app/src/main/java/com/gh/common/notifier/NotifierView.kt +++ b/app/src/main/java/com/gh/common/notifier/NotifierView.kt @@ -1,23 +1,24 @@ 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.support.v4.view.ViewCompat import android.text.TextUtils import android.util.AttributeSet +import android.util.DisplayMetrics import android.util.Log import android.util.TypedValue -import android.view.Gravity -import android.view.MotionEvent -import android.view.View -import android.view.ViewGroup +import android.view.* import android.widget.FrameLayout import com.gh.common.util.doOnEnd import com.gh.common.util.doOnStart import com.gh.gamecenter.R import kotlinx.android.synthetic.main.view_notifier.view.* + class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : FrameLayout(context, attrs, defStyle) { @@ -56,6 +57,8 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS var veryBottom: Float = 0F var centerX: Float = 0F + var navigationHeight = 0 + var textWidth: Int = 0 var cardViewWidth: Int = 0 @@ -69,6 +72,8 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS cardView.scaleX = SCALE_MINI cardView.scaleY = SCALE_MINI + navigationHeight = retrieveNavigationHeight() + rightToLeftPath = Path() leftToRightPath = Path() zoomInPath = Path() @@ -85,7 +90,7 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS // TODO Provide method to change these absolute offset. val r = right - dp2px(72F).toFloat() - val b = bottom - dp2px(145F).toFloat() + val b = bottom - dp2px(145F).toFloat() - navigationHeight rightToLeftPath.moveTo(r, b) rightToLeftPath.lineTo(centerX, b) @@ -167,8 +172,24 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS override fun onDetachedFromWindow() { super.onDetachedFromWindow() - showAnimatorSet.removeAllListeners() - hideAnimatorSet.removeAllListeners() + showAnimatorSet.cancel() + hideAnimatorSet.cancel() + + removeAllListeners(expandAnimator, + shrinkAnimator, + translateUpAnimator, + translateDownAnimator, + translateToLeftAnimator, + translateToRightAnimator) + } + + private fun removeAllListeners(vararg ts: Animator) { + for (a in ts) { + a.removeAllListeners() + if (a is ValueAnimator) { + a.removeAllUpdateListeners() + } + } } override fun onTouchEvent(event: MotionEvent): Boolean { @@ -247,6 +268,42 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.applicationContext.resources.displayMetrics).toInt() } + 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/gamecenter/fragment/MainWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java index 76af6b6e61..7a154dab76 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -131,11 +131,14 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable { case INDEX_PERSONAL: DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "我的光环"); - if (!Notifier.isNotifierShowing(CurrentActivityHolder.getCurrentActivity())) { + if (Notifier.isNotExistInActivity(CurrentActivityHolder.getCurrentActivity())) { Notifier.create(CurrentActivityHolder.getCurrentActivity()) .setText("莎拉凯瑞甘回答了你关注的问题") .setDuration(5000) - .setOnClickListener(v -> Toast.makeText(getContext(),"翻云破浪", Toast.LENGTH_SHORT).show()) + .setOnClickListener(v -> { + Toast.makeText(getContext(), "翻云破浪", Toast.LENGTH_SHORT).show(); + Notifier.hide(); + }) .show(); } break;