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