From 47bf19487f3a523c71de72ae76617e0d8c8afa3f Mon Sep 17 00:00:00 2001 From: Gajendra Singh Rathore Date: Wed, 18 Oct 2023 18:08:27 +0530 Subject: [PATCH 1/6] added background dim functionality for CascadePopup --- .../java/me/saket/cascade/CascadePopupMenu.kt | 18 ++++++++++++++++++ .../me/saket/cascade/sample/SampleActivity.kt | 1 + 2 files changed, 19 insertions(+) diff --git a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt index 9865f16..c25ba88 100644 --- a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt +++ b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt @@ -5,7 +5,10 @@ package me.saket.cascade import android.annotation.SuppressLint import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable +import android.util.Log import android.view.Gravity import android.view.Menu import android.view.MenuItem @@ -15,6 +18,9 @@ import android.view.View.SCROLLBARS_INSIDE_OVERLAY import android.view.ViewGroup.LayoutParams import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import android.widget.PopupMenu.OnDismissListener +import android.widget.PopupWindow +import androidx.annotation.IntRange import androidx.annotation.MenuRes import androidx.appcompat.view.SupportMenuInflater import androidx.appcompat.view.menu.MenuBuilder @@ -150,6 +156,18 @@ open class CascadePopupMenu @JvmOverloads constructor( fun dismiss() = popup.dismiss() + fun applyBackgroundDim(parent: View, @IntRange(from = 0, to = 255) dimAmount: Int) { + val dim: Drawable = ColorDrawable(Color.BLACK) + dim.setBounds(0, 0, parent.width, parent.height) + dim.alpha = dimAmount + val overlay = parent.overlay + overlay.add(dim) + + popup.setOnDismissListener { + overlay.clear() + } + } + @get:JvmName("getDragToOpenListener") @Deprecated("CascadeMenu doesn't support drag-to-open.", level = ERROR) val dragToOpenListener: View.OnTouchListener diff --git a/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt b/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt index 360f6a6..9311c1c 100644 --- a/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt +++ b/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt @@ -85,6 +85,7 @@ class SampleActivity : AppCompatActivity() { } } } + popupMenu.applyBackgroundDim(parent = anchor.rootView, dimAmount = 40) popupMenu.show() } From 170bef250f2cd75adcc93c4ddb94863640972df6 Mon Sep 17 00:00:00 2001 From: Gajendra Singh Rathore Date: Wed, 18 Oct 2023 18:14:02 +0530 Subject: [PATCH 2/6] Optimized imports --- cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt index c25ba88..ece2cbc 100644 --- a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt +++ b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt @@ -8,7 +8,6 @@ import android.content.Context import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable -import android.util.Log import android.view.Gravity import android.view.Menu import android.view.MenuItem @@ -18,8 +17,6 @@ import android.view.View.SCROLLBARS_INSIDE_OVERLAY import android.view.ViewGroup.LayoutParams import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import android.widget.PopupMenu.OnDismissListener -import android.widget.PopupWindow import androidx.annotation.IntRange import androidx.annotation.MenuRes import androidx.appcompat.view.SupportMenuInflater From d029e93a40e683f89030d054cf26f3d1e5aeee9a Mon Sep 17 00:00:00 2001 From: Gajendra Singh Rathore Date: Sat, 24 Feb 2024 15:34:16 +0530 Subject: [PATCH 3/6] added dimAmount property to show method --- cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt | 6 +++--- .../src/main/java/me/saket/cascade/sample/SampleActivity.kt | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt index ece2cbc..df6f529 100644 --- a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt +++ b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt @@ -71,7 +71,7 @@ open class CascadePopupMenu @JvmOverloads constructor( } } - fun show() { + fun show(@IntRange(from = 0, to = 255) dimAmount: Int = 80) { // PopupWindow moves the popup to align with the anchor if a fixed width // is known before hand. Note to self: If fixedWidth ever needs to be // removed, copy over MenuPopup.measureIndividualMenuWidth(). @@ -86,7 +86,7 @@ open class CascadePopupMenu @JvmOverloads constructor( styler.background()?.let { popup.contentView.background = it } - + applyBackgroundDim(anchor.rootView, dimAmount) showMenu(menuBuilder, goingForward = true) popup.showAsDropDown(anchor, 0, 0, gravity) } @@ -153,7 +153,7 @@ open class CascadePopupMenu @JvmOverloads constructor( fun dismiss() = popup.dismiss() - fun applyBackgroundDim(parent: View, @IntRange(from = 0, to = 255) dimAmount: Int) { + private fun applyBackgroundDim(parent: View, @IntRange(from = 0, to = 255) dimAmount: Int) { val dim: Drawable = ColorDrawable(Color.BLACK) dim.setBounds(0, 0, parent.width, parent.height) dim.alpha = dimAmount diff --git a/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt b/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt index 9311c1c..360f6a6 100644 --- a/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt +++ b/sample/src/main/java/me/saket/cascade/sample/SampleActivity.kt @@ -85,7 +85,6 @@ class SampleActivity : AppCompatActivity() { } } } - popupMenu.applyBackgroundDim(parent = anchor.rootView, dimAmount = 40) popupMenu.show() } From fd3ac3b3d08c69b7850a57151b22256729919c00 Mon Sep 17 00:00:00 2001 From: Gajendra Singh Rathore Date: Sat, 24 Feb 2024 15:37:45 +0530 Subject: [PATCH 4/6] removed extra param and using anchor.rootView --- .../src/main/java/me/saket/cascade/CascadePopupMenu.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt index df6f529..56af58b 100644 --- a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt +++ b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt @@ -86,7 +86,7 @@ open class CascadePopupMenu @JvmOverloads constructor( styler.background()?.let { popup.contentView.background = it } - applyBackgroundDim(anchor.rootView, dimAmount) + applyBackgroundDim(dimAmount) showMenu(menuBuilder, goingForward = true) popup.showAsDropDown(anchor, 0, 0, gravity) } @@ -153,11 +153,11 @@ open class CascadePopupMenu @JvmOverloads constructor( fun dismiss() = popup.dismiss() - private fun applyBackgroundDim(parent: View, @IntRange(from = 0, to = 255) dimAmount: Int) { + private fun applyBackgroundDim(@IntRange(from = 0, to = 255) dimAmount: Int) { val dim: Drawable = ColorDrawable(Color.BLACK) - dim.setBounds(0, 0, parent.width, parent.height) + dim.setBounds(0, 0, anchor.rootView.width, anchor.rootView.height) dim.alpha = dimAmount - val overlay = parent.overlay + val overlay = anchor.rootView.overlay overlay.add(dim) popup.setOnDismissListener { From c7100809d64df9a5e4d5fd508030f5084f79adb1 Mon Sep 17 00:00:00 2001 From: Gajendra Singh Rathore Date: Sat, 24 Feb 2024 15:39:32 +0530 Subject: [PATCH 5/6] default dimAmount set to null and added nullcheck so it wont be called in that case. --- cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt index 56af58b..b4bb973 100644 --- a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt +++ b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt @@ -71,7 +71,7 @@ open class CascadePopupMenu @JvmOverloads constructor( } } - fun show(@IntRange(from = 0, to = 255) dimAmount: Int = 80) { + fun show(@IntRange(from = 0, to = 255) dimAmount: Int? = null) { // PopupWindow moves the popup to align with the anchor if a fixed width // is known before hand. Note to self: If fixedWidth ever needs to be // removed, copy over MenuPopup.measureIndividualMenuWidth(). @@ -86,7 +86,9 @@ open class CascadePopupMenu @JvmOverloads constructor( styler.background()?.let { popup.contentView.background = it } - applyBackgroundDim(dimAmount) + dimAmount?.let { + applyBackgroundDim(dimAmount) + } showMenu(menuBuilder, goingForward = true) popup.showAsDropDown(anchor, 0, 0, gravity) } From bf242e0717531efcdda07b2ba08406a822d305ba Mon Sep 17 00:00:00 2001 From: Gajendra Singh Rathore Date: Sat, 24 Feb 2024 15:55:38 +0530 Subject: [PATCH 6/6] Added animation for adding and removing background dim. --- .../java/me/saket/cascade/CascadePopupMenu.kt | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt index b4bb973..356aa70 100644 --- a/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt +++ b/cascade/src/main/java/me/saket/cascade/CascadePopupMenu.kt @@ -3,6 +3,9 @@ package me.saket.cascade +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Context import android.graphics.Color @@ -158,12 +161,27 @@ open class CascadePopupMenu @JvmOverloads constructor( private fun applyBackgroundDim(@IntRange(from = 0, to = 255) dimAmount: Int) { val dim: Drawable = ColorDrawable(Color.BLACK) dim.setBounds(0, 0, anchor.rootView.width, anchor.rootView.height) - dim.alpha = dimAmount + dim.alpha = 0 val overlay = anchor.rootView.overlay overlay.add(dim) + /* FADE IN: Animating dim from 0 to dimAmount */ + ObjectAnimator.ofInt(dim, "alpha", dimAmount).apply { + duration = 300 + start() + } + popup.setOnDismissListener { - overlay.clear() + /* FADE OUT: Animating dim from dimAbout to 0 */ + ObjectAnimator.ofInt(dim, "alpha", 0).apply { + duration = 300 + addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + overlay.clear() + } + }) + start() + } } }