Merge "Apply alpha to status bar during unfold"
This commit is contained in:
committed by
Android (Google) Code Review
commit
fc3e8ba58a
@@ -42,7 +42,9 @@ class UnfoldMoveFromCenterAnimator @JvmOverloads constructor(
|
||||
* are different than actual bounds (e.g. view container may
|
||||
* have larger width than width of the items in the container)
|
||||
*/
|
||||
private val viewCenterProvider: ViewCenterProvider = object : ViewCenterProvider {}
|
||||
private val viewCenterProvider: ViewCenterProvider = object : ViewCenterProvider {},
|
||||
/** Allows to set the alpha based on the progress. */
|
||||
private val alphaProvider: AlphaProvider? = null
|
||||
) : UnfoldTransitionProgressProvider.TransitionProgressListener {
|
||||
|
||||
private val screenSize = Point()
|
||||
@@ -99,17 +101,27 @@ class UnfoldMoveFromCenterAnimator @JvmOverloads constructor(
|
||||
|
||||
override fun onTransitionProgress(progress: Float) {
|
||||
animatedViews.forEach {
|
||||
it.view.get()?.let { view ->
|
||||
translationApplier.apply(
|
||||
view = view,
|
||||
x = it.startTranslationX * (1 - progress),
|
||||
y = it.startTranslationY * (1 - progress)
|
||||
)
|
||||
}
|
||||
it.applyTransition(progress)
|
||||
it.applyAlpha(progress)
|
||||
}
|
||||
lastAnimationProgress = progress
|
||||
}
|
||||
|
||||
private fun AnimatedView.applyTransition(progress: Float) {
|
||||
view.get()?.let { view ->
|
||||
translationApplier.apply(
|
||||
view = view,
|
||||
x = startTranslationX * (1 - progress),
|
||||
y = startTranslationY * (1 - progress)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun AnimatedView.applyAlpha(progress: Float) {
|
||||
if (alphaProvider == null) return
|
||||
view.get()?.alpha = alphaProvider.getAlpha(progress)
|
||||
}
|
||||
|
||||
private fun createAnimatedView(view: View): AnimatedView =
|
||||
AnimatedView(view = WeakReference(view)).updateAnimatedView(view)
|
||||
|
||||
@@ -146,6 +158,13 @@ class UnfoldMoveFromCenterAnimator @JvmOverloads constructor(
|
||||
}
|
||||
}
|
||||
|
||||
/** Allows to set a custom alpha based on the progress. */
|
||||
interface AlphaProvider {
|
||||
|
||||
/** Returns the alpha views should have at a given progress. */
|
||||
fun getAlpha(progress: Float): Float
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface that allows to use custom logic to get the center of the view
|
||||
*/
|
||||
|
||||
@@ -49,29 +49,29 @@ class PhoneStatusBarViewController private constructor(
|
||||
}
|
||||
|
||||
override fun onViewAttached() {
|
||||
moveFromCenterAnimationController?.let { animationController ->
|
||||
val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side)
|
||||
val systemIconArea: ViewGroup = mView.findViewById(R.id.system_icon_area)
|
||||
if (moveFromCenterAnimationController == null) return
|
||||
|
||||
val viewsToAnimate = arrayOf(
|
||||
statusBarLeftSide,
|
||||
systemIconArea
|
||||
)
|
||||
val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side)
|
||||
val systemIconArea: ViewGroup = mView.findViewById(R.id.system_icon_area)
|
||||
|
||||
mView.viewTreeObserver.addOnPreDrawListener(object :
|
||||
ViewTreeObserver.OnPreDrawListener {
|
||||
override fun onPreDraw(): Boolean {
|
||||
animationController.onViewsReady(viewsToAnimate)
|
||||
mView.viewTreeObserver.removeOnPreDrawListener(this)
|
||||
return true
|
||||
}
|
||||
})
|
||||
val viewsToAnimate = arrayOf(
|
||||
statusBarLeftSide,
|
||||
systemIconArea
|
||||
)
|
||||
|
||||
mView.addOnLayoutChangeListener { _, left, _, right, _, oldLeft, _, oldRight, _ ->
|
||||
val widthChanged = right - left != oldRight - oldLeft
|
||||
if (widthChanged) {
|
||||
moveFromCenterAnimationController.onStatusBarWidthChanged()
|
||||
}
|
||||
mView.viewTreeObserver.addOnPreDrawListener(object :
|
||||
ViewTreeObserver.OnPreDrawListener {
|
||||
override fun onPreDraw(): Boolean {
|
||||
moveFromCenterAnimationController.onViewsReady(viewsToAnimate)
|
||||
mView.viewTreeObserver.removeOnPreDrawListener(this)
|
||||
return true
|
||||
}
|
||||
})
|
||||
|
||||
mView.addOnLayoutChangeListener { _, left, _, right, _, oldLeft, _, oldRight, _ ->
|
||||
val widthChanged = right - left != oldRight - oldLeft
|
||||
if (widthChanged) {
|
||||
moveFromCenterAnimationController.onStatusBarWidthChanged()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,9 +162,7 @@ class PhoneStatusBarViewController private constructor(
|
||||
PhoneStatusBarViewController(
|
||||
view,
|
||||
progressProvider.getOrNull(),
|
||||
unfoldComponent.map {
|
||||
it.getStatusBarMoveFromCenterAnimationController()
|
||||
}.getOrNull(),
|
||||
unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController(),
|
||||
touchEventHandler,
|
||||
configurationController
|
||||
)
|
||||
|
||||
@@ -18,11 +18,13 @@ package com.android.systemui.statusbar.phone
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator
|
||||
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator.AlphaProvider
|
||||
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController.StatusBarViewsCenterProvider
|
||||
import com.android.systemui.unfold.SysUIUnfoldScope
|
||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
|
||||
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
|
||||
import javax.inject.Inject
|
||||
import kotlin.math.max
|
||||
|
||||
@SysUIUnfoldScope
|
||||
class StatusBarMoveFromCenterAnimationController @Inject constructor(
|
||||
@@ -31,8 +33,11 @@ class StatusBarMoveFromCenterAnimationController @Inject constructor(
|
||||
) {
|
||||
|
||||
private val transitionListener = TransitionListener()
|
||||
private val moveFromCenterAnimator = UnfoldMoveFromCenterAnimator(windowManager,
|
||||
viewCenterProvider = StatusBarViewsCenterProvider())
|
||||
private val moveFromCenterAnimator = UnfoldMoveFromCenterAnimator(
|
||||
windowManager,
|
||||
viewCenterProvider = StatusBarViewsCenterProvider(),
|
||||
alphaProvider = StatusBarIconsAlphaProvider()
|
||||
)
|
||||
|
||||
fun onViewsReady(viewsToAnimate: Array<View>) {
|
||||
moveFromCenterAnimator.updateDisplayProperties()
|
||||
@@ -65,4 +70,15 @@ class StatusBarMoveFromCenterAnimationController @Inject constructor(
|
||||
moveFromCenterAnimator.onTransitionProgress(1f)
|
||||
}
|
||||
}
|
||||
|
||||
private class StatusBarIconsAlphaProvider : AlphaProvider {
|
||||
override fun getAlpha(progress: Float): Float {
|
||||
return max(
|
||||
0f,
|
||||
(progress - ICONS_START_APPEARING_PROGRESS) / (1 - ICONS_START_APPEARING_PROGRESS)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private const val ICONS_START_APPEARING_PROGRESS = 0.75F
|
||||
|
||||
Reference in New Issue
Block a user