Last active
May 12, 2016 14:48
-
-
Save Limuyang1013/8d6cf40c1ce2983510adfb388cc4bd89 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//开始旋转 | |
public void turnLeft(View v) { | |
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v, "rotation", 0, -155, -135); | |
objectAnimator.setDuration(300); | |
objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); | |
objectAnimator.start(); | |
hide.setVisibility(View.VISIBLE); | |
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 0.75f); | |
alphaAnimation.setDuration(300); | |
alphaAnimation.setFillAfter(true); | |
hide.startAnimation(alphaAnimation); | |
hide.setClickable(true); | |
isOpen = true; | |
} | |
//回到起始位置 | |
public void turnRight(View v) { | |
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v, "rotation", -135, 20, 0); | |
objectAnimator.setDuration(300); | |
objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); | |
objectAnimator.start(); | |
hide.setVisibility(View.GONE); | |
AlphaAnimation alphaAnimation = new AlphaAnimation(0.75f, 0); | |
alphaAnimation.setDuration(300); | |
alphaAnimation.setFillAfter(true); | |
hide.startAnimation(alphaAnimation); | |
hide.setClickable(false); | |
isOpen = false; | |
} | |
//注:hide就是TextView控件(蒙版) | |
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior { | |
//先慢后快再慢 | |
private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); | |
private boolean mIsAnimatingOut = false; | |
public ScrollAwareFABBehavior(Context context, AttributeSet attrs) { | |
super(); | |
} | |
//初始条件 | |
@Override | |
public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, | |
final View directTargetChild, final View target, final int nestedScrollAxes) { | |
//垂直滚动 | |
return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL | |
|| super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); | |
} | |
@Override | |
public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, | |
final View target, final int dxConsumed, final int dyConsumed, | |
final int dxUnconsumed, final int dyUnconsumed) { | |
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); | |
if (dyConsumed > 0 && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) { | |
// User scrolled down and the FAB is currently visible -> hide the FAB | |
animateOut(child); | |
} else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { | |
// User scrolled up and the FAB is currently not visible -> show the FAB | |
animateIn(child); | |
} | |
} | |
// Same animation that FloatingActionButton.Behavior uses to hide the FAB when the AppBarLayout exits | |
private void animateOut(final FloatingActionButton button) { | |
if (Build.VERSION.SDK_INT >= 14) { | |
//withLayer()使动画中的某些操作变得更顺畅,加速渲染,API 14以后 | |
ViewCompat.animate(button).translationY(button.getHeight() + getMarginBottom(button)).setInterpolator(INTERPOLATOR).withLayer() | |
.setListener(new ViewPropertyAnimatorListener() { | |
public void onAnimationStart(View view) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = true; | |
} | |
public void onAnimationCancel(View view) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = false; | |
} | |
public void onAnimationEnd(View view) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = false; | |
view.setVisibility(View.GONE); | |
} | |
}).start(); | |
} else { | |
} | |
} | |
// Same animation that FloatingActionButton.Behavior uses to show the FAB when the AppBarLayout enters | |
private void animateIn(FloatingActionButton button) { | |
button.setVisibility(View.VISIBLE); | |
if (Build.VERSION.SDK_INT >= 14) { | |
ViewCompat.animate(button).translationY(0) | |
.setInterpolator(INTERPOLATOR).withLayer().setListener(null) | |
.start(); | |
} else { | |
} | |
} | |
private int getMarginBottom(View v) { | |
int marginBottom = 0; | |
final ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); | |
if (layoutParams instanceof ViewGroup.MarginLayoutParams) { | |
marginBottom = ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin; | |
} | |
return marginBottom; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment