From a03cca4fb7ca2d01d0829ff2a868ea9a0e8db8a4 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 30 Nov 2016 04:03:04 +0000 Subject: [PATCH] Merge "Use StateListAnimator for AppBarLayout elevation changes" into nyc-dev GitOrigin-RevId=cb849a71706ac0660a5383c11629bc8d9c1a9f28 PiperOrigin-RevId: 140560610 --- api/current.txt | 4 +- .../design/widget/ViewUtilsLollipop.java | 52 +++++ .../design_appbar_state_list_animator.xml | 43 ++++ res/values-v21/styles.xml | 24 +++ res/values/attrs.xml | 10 + res/values/styles.xml | 6 +- .../support/design/widget/AppBarLayout.java | 201 +++++++++++++----- .../widget/CollapsingToolbarLayout.java | 10 - .../support/design/widget/ViewUtils.java | 34 --- .../design/widget/AppBarLayoutBaseTest.java | 15 ++ .../AppBarWithCollapsingToolbarTest.java | 13 ++ .../widget/AppBarWithToolbarAndTabsTest.java | 18 ++ 12 files changed, 334 insertions(+), 96 deletions(-) create mode 100644 res/anim-v21/design_appbar_state_list_animator.xml create mode 100644 res/values-v21/styles.xml diff --git a/api/current.txt b/api/current.txt index af85c9df3..688957eda 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4,12 +4,12 @@ package android.support.design.widget { ctor public AppBarLayout(android.content.Context); ctor public AppBarLayout(android.content.Context, android.util.AttributeSet); method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener); - method public float getTargetElevation(); + method public deprecated float getTargetElevation(); method public final int getTotalScrollRange(); method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener); method public void setExpanded(boolean); method public void setExpanded(boolean, boolean); - method public void setTargetElevation(float); + method public deprecated void setTargetElevation(float); } public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior { diff --git a/lollipop/android/support/design/widget/ViewUtilsLollipop.java b/lollipop/android/support/design/widget/ViewUtilsLollipop.java index f080592b3..cb9fc8845 100644 --- a/lollipop/android/support/design/widget/ViewUtilsLollipop.java +++ b/lollipop/android/support/design/widget/ViewUtilsLollipop.java @@ -16,13 +16,65 @@ package android.support.design.widget; +import android.animation.AnimatorInflater; +import android.animation.ObjectAnimator; +import android.animation.StateListAnimator; +import android.content.Context; +import android.content.res.TypedArray; +import android.support.design.R; +import android.util.AttributeSet; import android.view.View; import android.view.ViewOutlineProvider; class ViewUtilsLollipop { + private static final int[] STATE_LIST_ANIM_ATTRS = new int[] {android.R.attr.stateListAnimator}; + static void setBoundsViewOutlineProvider(View view) { view.setOutlineProvider(ViewOutlineProvider.BOUNDS); } + static void setStateListAnimatorFromAttrs(View view, AttributeSet attrs, + int defStyleAttr, int defStyleRes) { + final Context context = view.getContext(); + final TypedArray a = context.obtainStyledAttributes(attrs, STATE_LIST_ANIM_ATTRS, + defStyleAttr, defStyleRes); + try { + if (a.hasValue(0)) { + StateListAnimator sla = AnimatorInflater.loadStateListAnimator(context, + a.getResourceId(0, 0)); + view.setStateListAnimator(sla); + } + } finally { + a.recycle(); + } + } + + /** + * Creates and sets a {@link StateListAnimator} with a custom elevation value + */ + static void setDefaultAppBarLayoutStateListAnimator(final View view, + final float targetElevation) { + final StateListAnimator sla = new StateListAnimator(); + + // Enabled, collapsible and collapsed == elevated + sla.addState(new int[]{android.R.attr.enabled, R.attr.state_collapsible, + R.attr.state_collapsed}, + ObjectAnimator.ofFloat(view, "elevation", targetElevation)); + + // Enabled and collapsible, but not collapsed != elevated + sla.addState(new int[]{android.R.attr.enabled, R.attr.state_collapsible, + -R.attr.state_collapsed}, + ObjectAnimator.ofFloat(view, "elevation", 0f)); + + // Enabled but not collapsible == elevated + sla.addState(new int[]{android.R.attr.enabled, -R.attr.state_collapsible}, + ObjectAnimator.ofFloat(view, "elevation", targetElevation)); + + // Default, none elevated state + sla.addState(new int[0], ObjectAnimator.ofFloat(view, "elevation", 0)); + + view.setStateListAnimator(sla); + } + } diff --git a/res/anim-v21/design_appbar_state_list_animator.xml b/res/anim-v21/design_appbar_state_list_animator.xml new file mode 100644 index 000000000..c7bba1407 --- /dev/null +++ b/res/anim-v21/design_appbar_state_list_animator.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values-v21/styles.xml b/res/values-v21/styles.xml new file mode 100644 index 000000000..76bde7838 --- /dev/null +++ b/res/values-v21/styles.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index f3abec119..4e54db4e0 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -210,6 +210,7 @@ + + + + + +