package org.lntu.online.ui.widget.design; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Rect; import android.os.Build; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.util.AttributeSet; import android.view.View; import android.view.animation.Interpolator; import android.widget.FrameLayout; import com.nineoldandroids.animation.Animator; import com.nineoldandroids.view.ViewPropertyAnimator; import org.lntu.online.R; @CoordinatorLayout.DefaultBehavior(FloatingActionFrameLayout.Behavior.class) public class FloatingActionFrameLayout extends FrameLayout { private static final Interpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new FastOutSlowInInterpolator(); public FloatingActionFrameLayout(Context context) { super(context); } public FloatingActionFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } public FloatingActionFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public FloatingActionFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public static class Behavior extends CoordinatorLayout.Behavior<FloatingActionFrameLayout> { private Rect mTmpRect; private boolean mIsAnimatingOut; @Override public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionFrameLayout child, View dependency) { if (dependency instanceof AppBarLayout) { // app:layout_anchor 设定为 AppBarLayout的时候 AppBarLayout appBarLayout = (AppBarLayout) dependency; if (mTmpRect == null) { mTmpRect = new Rect(); } Rect rect = mTmpRect; ViewGroupUtils.getDescendantRect(parent, dependency, rect); //if(rect.bottom <= appBarLayout.getMinimumHeightForVisibleOverlappingContent()) { // TODO if (rect.bottom <= appBarLayout.getResources().getDimension(R.dimen.floating_action_frame_layout_anim_height)) { if (!mIsAnimatingOut && child.getVisibility() == View.VISIBLE) { animateOut(child); } } else if (child.getVisibility() != View.VISIBLE) { animateIn(child); } } return false; } private void animateIn(FloatingActionFrameLayout button) { button.setVisibility(View.VISIBLE); ViewPropertyAnimator.animate(button).scaleX(1.0F).scaleY(1.0F).alpha(1.0F).setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR).setListener(null).start(); } private void animateOut(final FloatingActionFrameLayout button) { ViewPropertyAnimator.animate(button).scaleX(0.0F).scaleY(0.0F).alpha(0.0F).setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR).setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { Behavior.this.mIsAnimatingOut = true; } @Override public void onAnimationEnd(Animator animation) { Behavior.this.mIsAnimatingOut = false; button.setVisibility(View.GONE); } @Override public void onAnimationCancel(Animator animation) { Behavior.this.mIsAnimatingOut = false; } @Override public void onAnimationRepeat(Animator animation) { } }).start(); } } }