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 @@ + + + + + +