FloatingActionButtonLollipop.java revision 3d81c900316412b4130bf40e0dd8b0d3d3a93e78
19840efe3dbdc7026521da8576574c55120782f6cChris Banes/* 29840efe3dbdc7026521da8576574c55120782f6cChris Banes * Copyright (C) 2015 The Android Open Source Project 39840efe3dbdc7026521da8576574c55120782f6cChris Banes * 49840efe3dbdc7026521da8576574c55120782f6cChris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 59840efe3dbdc7026521da8576574c55120782f6cChris Banes * you may not use this file except in compliance with the License. 69840efe3dbdc7026521da8576574c55120782f6cChris Banes * You may obtain a copy of the License at 79840efe3dbdc7026521da8576574c55120782f6cChris Banes * 89840efe3dbdc7026521da8576574c55120782f6cChris Banes * http://www.apache.org/licenses/LICENSE-2.0 99840efe3dbdc7026521da8576574c55120782f6cChris Banes * 109840efe3dbdc7026521da8576574c55120782f6cChris Banes * Unless required by applicable law or agreed to in writing, software 119840efe3dbdc7026521da8576574c55120782f6cChris Banes * distributed under the License is distributed on an "AS IS" BASIS, 129840efe3dbdc7026521da8576574c55120782f6cChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139840efe3dbdc7026521da8576574c55120782f6cChris Banes * See the License for the specific language governing permissions and 149840efe3dbdc7026521da8576574c55120782f6cChris Banes * limitations under the License. 159840efe3dbdc7026521da8576574c55120782f6cChris Banes */ 169840efe3dbdc7026521da8576574c55120782f6cChris Banes 179840efe3dbdc7026521da8576574c55120782f6cChris Banespackage android.support.design.widget; 189840efe3dbdc7026521da8576574c55120782f6cChris Banes 199840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.animation.Animator; 209840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.animation.ObjectAnimator; 219840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.animation.StateListAnimator; 229840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.annotation.TargetApi; 239840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.content.res.ColorStateList; 249840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.graphics.PorterDuff; 259840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.graphics.drawable.Drawable; 26cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banesimport android.graphics.drawable.LayerDrawable; 279840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.graphics.drawable.RippleDrawable; 289840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.os.Build; 297e82b99953680915596eaf0eb35927388e574ca8Chris Banesimport android.support.v4.graphics.drawable.DrawableCompat; 309840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.support.v4.view.ViewCompat; 319840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.view.animation.AnimationUtils; 329840efe3dbdc7026521da8576574c55120782f6cChris Banesimport android.view.animation.Interpolator; 339840efe3dbdc7026521da8576574c55120782f6cChris Banes 349840efe3dbdc7026521da8576574c55120782f6cChris Banes@TargetApi(Build.VERSION_CODES.LOLLIPOP) 359ec922c215ed95a4bbd8bd7940e81dcfe6926893Chris Banesclass FloatingActionButtonLollipop extends FloatingActionButtonIcs { 369840efe3dbdc7026521da8576574c55120782f6cChris Banes 373d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes private final Interpolator mInterpolator; 389840efe3dbdc7026521da8576574c55120782f6cChris Banes 39fc780bab91bd4275ae2c3b75c3dfb327e008e4dbChris Banes FloatingActionButtonLollipop(VisibilityAwareImageButton view, 40fc780bab91bd4275ae2c3b75c3dfb327e008e4dbChris Banes ShadowViewDelegate shadowViewDelegate) { 419840efe3dbdc7026521da8576574c55120782f6cChris Banes super(view, shadowViewDelegate); 429840efe3dbdc7026521da8576574c55120782f6cChris Banes 433d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes mInterpolator = view.isInEditMode() ? null 443d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes : AnimationUtils.loadInterpolator(mView.getContext(), 453d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes android.R.interpolator.fast_out_slow_in); 469840efe3dbdc7026521da8576574c55120782f6cChris Banes } 479840efe3dbdc7026521da8576574c55120782f6cChris Banes 489840efe3dbdc7026521da8576574c55120782f6cChris Banes @Override 49097e80a3c5518c6bf2e9f3f9b55ed9f4b5cc37e8Chris Banes void setBackgroundDrawable(ColorStateList backgroundTint, 50cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes PorterDuff.Mode backgroundTintMode, int rippleColor, int borderWidth) { 51097e80a3c5518c6bf2e9f3f9b55ed9f4b5cc37e8Chris Banes // Now we need to tint the shape background with the tint 52097e80a3c5518c6bf2e9f3f9b55ed9f4b5cc37e8Chris Banes mShapeDrawable = DrawableCompat.wrap(createShapeDrawable()); 537e82b99953680915596eaf0eb35927388e574ca8Chris Banes DrawableCompat.setTintList(mShapeDrawable, backgroundTint); 549840efe3dbdc7026521da8576574c55120782f6cChris Banes if (backgroundTintMode != null) { 557e82b99953680915596eaf0eb35927388e574ca8Chris Banes DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode); 569840efe3dbdc7026521da8576574c55120782f6cChris Banes } 579840efe3dbdc7026521da8576574c55120782f6cChris Banes 58cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes final Drawable rippleContent; 59cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes if (borderWidth > 0) { 6080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes mBorderDrawable = createBorderDrawable(borderWidth, backgroundTint); 6180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes rippleContent = new LayerDrawable(new Drawable[]{mBorderDrawable, mShapeDrawable}); 62cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes } else { 63cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes mBorderDrawable = null; 64cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes rippleContent = mShapeDrawable; 65cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes } 66cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes 679840efe3dbdc7026521da8576574c55120782f6cChris Banes mRippleDrawable = new RippleDrawable(ColorStateList.valueOf(rippleColor), 68cd78954a2b32d9c22686f12c194fac7e49566cf6Chris Banes rippleContent, null); 699840efe3dbdc7026521da8576574c55120782f6cChris Banes 703d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes mContentBackground = mRippleDrawable; 713d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes 729840efe3dbdc7026521da8576574c55120782f6cChris Banes mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable); 739840efe3dbdc7026521da8576574c55120782f6cChris Banes mShadowViewDelegate.setShadowPadding(0, 0, 0, 0); 749840efe3dbdc7026521da8576574c55120782f6cChris Banes } 759840efe3dbdc7026521da8576574c55120782f6cChris Banes 769840efe3dbdc7026521da8576574c55120782f6cChris Banes @Override 779840efe3dbdc7026521da8576574c55120782f6cChris Banes void setRippleColor(int rippleColor) { 788603357c9433b9aef1805413a3bfc4a4f8decc50Chris Banes if (mRippleDrawable instanceof RippleDrawable) { 798603357c9433b9aef1805413a3bfc4a4f8decc50Chris Banes ((RippleDrawable) mRippleDrawable).setColor(ColorStateList.valueOf(rippleColor)); 808603357c9433b9aef1805413a3bfc4a4f8decc50Chris Banes } else { 818603357c9433b9aef1805413a3bfc4a4f8decc50Chris Banes super.setRippleColor(rippleColor); 828603357c9433b9aef1805413a3bfc4a4f8decc50Chris Banes } 839840efe3dbdc7026521da8576574c55120782f6cChris Banes } 849840efe3dbdc7026521da8576574c55120782f6cChris Banes 859840efe3dbdc7026521da8576574c55120782f6cChris Banes @Override 863d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes public void onElevationChanged(float elevation) { 879840efe3dbdc7026521da8576574c55120782f6cChris Banes ViewCompat.setElevation(mView, elevation); 889840efe3dbdc7026521da8576574c55120782f6cChris Banes } 899840efe3dbdc7026521da8576574c55120782f6cChris Banes 909840efe3dbdc7026521da8576574c55120782f6cChris Banes @Override 913d81c900316412b4130bf40e0dd8b0d3d3a93e78Chris Banes void onTranslationZChanged(float translationZ) { 929840efe3dbdc7026521da8576574c55120782f6cChris Banes StateListAnimator stateListAnimator = new StateListAnimator(); 939840efe3dbdc7026521da8576574c55120782f6cChris Banes 949840efe3dbdc7026521da8576574c55120782f6cChris Banes // Animate translationZ to our value when pressed or focused 959840efe3dbdc7026521da8576574c55120782f6cChris Banes stateListAnimator.addState(PRESSED_ENABLED_STATE_SET, 969840efe3dbdc7026521da8576574c55120782f6cChris Banes setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", translationZ))); 979840efe3dbdc7026521da8576574c55120782f6cChris Banes stateListAnimator.addState(FOCUSED_ENABLED_STATE_SET, 989840efe3dbdc7026521da8576574c55120782f6cChris Banes setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", translationZ))); 999840efe3dbdc7026521da8576574c55120782f6cChris Banes // Animate translationZ to 0 otherwise 1009840efe3dbdc7026521da8576574c55120782f6cChris Banes stateListAnimator.addState(EMPTY_STATE_SET, 1019840efe3dbdc7026521da8576574c55120782f6cChris Banes setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", 0f))); 1029840efe3dbdc7026521da8576574c55120782f6cChris Banes 1039840efe3dbdc7026521da8576574c55120782f6cChris Banes mView.setStateListAnimator(stateListAnimator); 1049840efe3dbdc7026521da8576574c55120782f6cChris Banes } 1059840efe3dbdc7026521da8576574c55120782f6cChris Banes 1069840efe3dbdc7026521da8576574c55120782f6cChris Banes @Override 1079840efe3dbdc7026521da8576574c55120782f6cChris Banes void onDrawableStateChanged(int[] state) { 1089840efe3dbdc7026521da8576574c55120782f6cChris Banes // no-op 1099840efe3dbdc7026521da8576574c55120782f6cChris Banes } 1109840efe3dbdc7026521da8576574c55120782f6cChris Banes 1119840efe3dbdc7026521da8576574c55120782f6cChris Banes @Override 1129840efe3dbdc7026521da8576574c55120782f6cChris Banes void jumpDrawableToCurrentState() { 1139840efe3dbdc7026521da8576574c55120782f6cChris Banes // no-op 1149840efe3dbdc7026521da8576574c55120782f6cChris Banes } 1159840efe3dbdc7026521da8576574c55120782f6cChris Banes 116d9770e12c8ff2d4417700492c6616572be897e93Chris Banes @Override 117d9770e12c8ff2d4417700492c6616572be897e93Chris Banes boolean requirePreDrawListener() { 118d9770e12c8ff2d4417700492c6616572be897e93Chris Banes return false; 119d9770e12c8ff2d4417700492c6616572be897e93Chris Banes } 120d9770e12c8ff2d4417700492c6616572be897e93Chris Banes 1219840efe3dbdc7026521da8576574c55120782f6cChris Banes private Animator setupAnimator(Animator animator) { 1229840efe3dbdc7026521da8576574c55120782f6cChris Banes animator.setInterpolator(mInterpolator); 1239840efe3dbdc7026521da8576574c55120782f6cChris Banes return animator; 1249840efe3dbdc7026521da8576574c55120782f6cChris Banes } 12580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes 12680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes @Override 12780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes CircularBorderDrawable newCircularDrawable() { 12880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes return new CircularBorderDrawableLollipop(); 12980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes } 130124d52000d70f3a0ef64b1c70b72238441cbf0edDeepanshu Gupta} 131