FloatingActionButtonLollipop.java revision 7e82b99953680915596eaf0eb35927388e574ca8
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.support.design.widget; 18 19import android.animation.Animator; 20import android.animation.ObjectAnimator; 21import android.animation.StateListAnimator; 22import android.annotation.TargetApi; 23import android.content.res.ColorStateList; 24import android.graphics.PorterDuff; 25import android.graphics.drawable.Drawable; 26import android.graphics.drawable.RippleDrawable; 27import android.os.Build; 28import android.support.v4.graphics.drawable.DrawableCompat; 29import android.support.v4.view.ViewCompat; 30import android.view.View; 31import android.view.animation.AnimationUtils; 32import android.view.animation.Interpolator; 33 34@TargetApi(Build.VERSION_CODES.LOLLIPOP) 35class FloatingActionButtonLollipop extends FloatingActionButtonImpl { 36 37 private Drawable mShapeDrawable; 38 private RippleDrawable mRippleDrawable; 39 40 private final Interpolator mInterpolator; 41 42 FloatingActionButtonLollipop(View view, ShadowViewDelegate shadowViewDelegate) { 43 super(view, shadowViewDelegate); 44 45 mInterpolator = AnimationUtils.loadInterpolator( 46 mView.getContext(), android.R.interpolator.fast_out_slow_in); 47 } 48 49 @Override 50 void setBackgroundDrawable(Drawable originalBackground, ColorStateList backgroundTint, 51 PorterDuff.Mode backgroundTintMode, int rippleColor) { 52 mShapeDrawable = DrawableCompat.wrap(originalBackground); 53 54 DrawableCompat.setTintList(mShapeDrawable, backgroundTint); 55 if (backgroundTintMode != null) { 56 DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode); 57 } 58 59 mRippleDrawable = new RippleDrawable(ColorStateList.valueOf(rippleColor), 60 mShapeDrawable, null); 61 62 mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable); 63 mShadowViewDelegate.setShadowPadding(0, 0, 0, 0); 64 } 65 66 @Override 67 void setBackgroundTintList(ColorStateList tint) { 68 DrawableCompat.setTintList(mShapeDrawable, tint); 69 } 70 71 @Override 72 void setBackgroundTintMode(PorterDuff.Mode tintMode) { 73 DrawableCompat.setTintMode(mShapeDrawable, tintMode); 74 } 75 76 @Override 77 void setRippleColor(int rippleColor) { 78 DrawableCompat.setTint(mRippleDrawable, rippleColor); 79 } 80 81 @Override 82 public void setElevation(float elevation) { 83 ViewCompat.setElevation(mView, elevation); 84 } 85 86 @Override 87 void setPressedTranslationZ(float translationZ) { 88 StateListAnimator stateListAnimator = new StateListAnimator(); 89 90 // Animate translationZ to our value when pressed or focused 91 stateListAnimator.addState(PRESSED_ENABLED_STATE_SET, 92 setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", translationZ))); 93 stateListAnimator.addState(FOCUSED_ENABLED_STATE_SET, 94 setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", translationZ))); 95 // Animate translationZ to 0 otherwise 96 stateListAnimator.addState(EMPTY_STATE_SET, 97 setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", 0f))); 98 99 mView.setStateListAnimator(stateListAnimator); 100 } 101 102 @Override 103 void onDrawableStateChanged(int[] state) { 104 // no-op 105 } 106 107 @Override 108 void jumpDrawableToCurrentState() { 109 // no-op 110 } 111 112 private Animator setupAnimator(Animator animator) { 113 animator.setInterpolator(mInterpolator); 114 return animator; 115 } 116}