/** * Animates a tab to be swiped horizontally. * * @param tabItem * The tab item, which corresponds to the tab, which should be swiped, as an instance of * the class {@link TabItem}. The tab item may not be null * @param targetPosition * The position on the x-axis, the tab should be moved to, in pixels as a {@link Float} * value * @param selected * True, if the tab should become the selected one, false otherwise * @param animationDuration * The duration of the animation in milliseconds as a {@link Long} value * @param velocity * The velocity of the drag gesture, which caused the tab to be swiped, in pixels per * second as a {@link Float} value */ private void animateSwipe(@NonNull final TabItem tabItem, final float targetPosition, final boolean selected, final long animationDuration, final float velocity) { View view = tabItem.getView(); float currentPosition = getArithmetics().getPosition(Axis.X_AXIS, tabItem); float distance = Math.abs(targetPosition - currentPosition); float maxDistance = getArithmetics().getSize(Axis.X_AXIS, tabItem) + swipedTabDistance; long duration = velocity > 0 ? Math.round((distance / velocity) * 1000) : Math.round(animationDuration * (distance / maxDistance)); ViewPropertyAnimator animation = view.animate(); animation.setListener(new AnimationListenerWrapper( selected ? createSwipeSelectedTabAnimationListener(tabItem) : createSwipeNeighborAnimationListener(tabItem))); animation.setInterpolator(new AccelerateDecelerateInterpolator()); animation.setDuration(duration); animation.setStartDelay(0); getArithmetics().animatePosition(Axis.X_AXIS, animation, tabItem, targetPosition, true); animation.start(); }
/** */ @Override void hideProgressBar(SearchView searchView) { final CircularProgressBar progressBar = searchView.mProgressBar; final ViewPropertyAnimator progressBarAnimator = progressBar.animate(); progressBarAnimator.setListener(null); progressBarAnimator.cancel(); progressBarAnimator .alpha(0.0f) .setDuration(UiConfig.ANIMATION_DURATION_SHORT) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { progressBar.setVisibility(View.INVISIBLE); } }) .start(); final View icon = searchView.mButtonIcon; final ViewPropertyAnimator iconAnimator = icon.animate(); iconAnimator.setListener(null); iconAnimator.cancel(); icon.setVisibility(View.VISIBLE); icon.setScaleX(0.5f); icon.setScaleY(0.5f); icon.setAlpha(0.0f); iconAnimator .scaleX(1.0f) .scaleY(1.0f) .alpha(1.0f) .setDuration(UiConfig.ANIMATION_DURATION_SHORT) .setInterpolator(iconInterpolator) .setListener(null) .start(); }
public static void listItemUpAnim(View view, int position, AnimatorListenerAdapter animatorListenerAdapter) { view.setTranslationY(150); view.setAlpha(0.f); ViewPropertyAnimator animate = view.animate(); animate.translationY(0).alpha(1.f) .setStartDelay(20 * (position)) .setInterpolator(new DecelerateInterpolator(2.f)) .setDuration(400); if (animatorListenerAdapter != null) { animate.setListener(animatorListenerAdapter); } animate.withLayer().start(); }
/** * Starts a reveal animation to add a specific tab. * * @param item * The item, which corresponds to the tab, which should be added, as an instance of the * class {@link AbstractItem}. The item may not be null * @param revealAnimation * The reveal animation, which should be started, as an instance of the class {@link * RevealAnimation}. The reveal animation may not be null */ private void animateReveal(@NonNull final AbstractItem item, @NonNull final RevealAnimation revealAnimation) { tabViewBottomMargin = -1; tabRecyclerAdapter.clearCachedPreviews(); dragHandler.setCallback(null); View view = item.getView(); ViewPropertyAnimator animation = view.animate(); animation.setInterpolator( revealAnimation.getInterpolator() != null ? revealAnimation.getInterpolator() : new AccelerateDecelerateInterpolator()); animation.setListener(new AnimationListenerWrapper(createHideSwitcherAnimationListener())); animation.setStartDelay(0); animation.setDuration(revealAnimation.getDuration() != -1 ? revealAnimation.getDuration() : revealAnimationDuration); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, 1); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, 1); animation.start(); animateToolbarVisibility(getModel().areToolbarsShown() && getModel().isEmpty(), 0); }
private void addFixViewWithAnimator(LayoutManagerHelper layoutManagerHelper, View fixView) { if (mFixViewAnimatorHelper != null) { ViewPropertyAnimator animator = mFixViewAnimatorHelper .onGetFixViewAppearAnimator(fixView); if (animator != null) { fixView.setVisibility(View.INVISIBLE); layoutManagerHelper.addFixedView(fixView); mFixViewAppearAnimatorListener.bindAction(layoutManagerHelper, fixView); animator.setListener(mFixViewAppearAnimatorListener).start(); } else { layoutManagerHelper.addFixedView(fixView); } } else { layoutManagerHelper.addFixedView(fixView); } isRemoveFixViewImmediately = false; }
private void removeFixViewWithAnimator(RecyclerView.Recycler recycler, LayoutManagerHelper layoutManagerHelper, View fixView) { if (!isRemoveFixViewImmediately && mFixViewAnimatorHelper != null) { ViewPropertyAnimator animator = mFixViewAnimatorHelper .onGetFixViewDisappearAnimator(fixView); if (animator != null) { mFixViewDisappearAnimatorListener .bindAction(recycler, layoutManagerHelper, fixView); animator.setListener(mFixViewDisappearAnimatorListener).start(); isAddFixViewImmediately = false; } else { layoutManagerHelper.removeChildView(fixView); recycler.recycleView(fixView); isAddFixViewImmediately = false; } } else { layoutManagerHelper.removeChildView(fixView); recycler.recycleView(fixView); isAddFixViewImmediately = false; } }
public static void startAnimators(final View view, int startOffsetX, int startOffsetY, long delay) { if (view.getVisibility() == View.VISIBLE && view.getAlpha() != 0f) { view.clearAnimation(); view.animate().cancel(); final Resources res = view.getResources(); final float endAlpha = view.getAlpha(); final float endTranslateX = view.getTranslationX(); final float endTranslateY = view.getTranslationY(); view.setAlpha(0); final Animator fade = ObjectAnimator.ofFloat(view, View.ALPHA, endAlpha); fade.setDuration(res.getInteger(R.integer.material_in_fade_anim_duration)); fade.setInterpolator(new AccelerateInterpolator()); fade.setStartDelay(delay); fade.start(); ViewPropertyAnimator slide = view.animate(); if (startOffsetY != 0) { view.setTranslationY(startOffsetY); slide.translationY(endTranslateY); } else { view.setTranslationX(startOffsetX); slide.translationX(endTranslateX); } slide.setInterpolator(new DecelerateInterpolator(2)); slide.setDuration(res.getInteger(R.integer.material_in_slide_anim_duration)); slide.setStartDelay(delay); slide.setListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(Animator animation) { if (fade.isStarted()) { fade.cancel(); } view.setAlpha(endAlpha); view.setTranslationX(endTranslateX); view.setTranslationY(endTranslateY); } }); slide.start(); } }
private ViewPropertyAnimator resetCardPosition() { if (rightView != null) { rightView.setAlpha(0); } if (leftView != null) { leftView.setAlpha(0); } //todo: figure out why i have to set translationX to 0 return card.animate() .setDuration(SwipeDeck.ANIMATION_DURATION) .setInterpolator(new OvershootInterpolator(1.5f)) .x(initialX) .y(initialY) .rotation(0) .translationX(0); }
public static void listItemUpAnimSlow(View view, int position, AnimatorListenerAdapter animatorListenerAdapter) { view.setTranslationY(150); view.setAlpha(0.f); ViewPropertyAnimator animate = view.animate(); animate.translationY(0).alpha(1.f) .setStartDelay(70 * (position)) .setInterpolator(new DecelerateInterpolator(2.f)) .setDuration(400); if (animatorListenerAdapter != null) { animate.setListener(animatorListenerAdapter); } animate.withLayer().start(); }
/** * Animates to rotation of all tabs to be reset to normal. * * @param interpolator * The interpolator, which should be used by the animation, as an instance of the type * {@link Interpolator}. The interpolator may not be null * @param maxAngle * The angle, the tabs may be rotated by at maximum, in degrees as a {@link Float} * value * @param listener * The listener, which should be notified about the animation's progress, as an instance * of the type {@link AnimatorListener} or null, if no listener should be notified * @return True, if at least one tab was animated, false otherwise */ private boolean animateTilt(@NonNull final Interpolator interpolator, final float maxAngle, @Nullable final AnimatorListener listener) { TabItemIterator iterator = new TabItemIterator.Builder(getTabSwitcher(), viewRecycler).reverse(true).create(); TabItem tabItem; boolean result = false; while ((tabItem = iterator.next()) != null) { if (tabItem.isInflated()) { View view = tabItem.getView(); if (getArithmetics().getRotation(Axis.ORTHOGONAL_AXIS, view) != 0) { ViewPropertyAnimator animation = view.animate(); animation.setListener(new AnimationListenerWrapper( createRevertOvershootAnimationListener(view, !result ? listener : null))); animation.setDuration(Math.round(revertOvershootAnimationDuration * (Math.abs(getArithmetics().getRotation(Axis.ORTHOGONAL_AXIS, view)) / maxAngle))); animation.setInterpolator(interpolator); getArithmetics().animateRotation(Axis.ORTHOGONAL_AXIS, animation, 0); animation.setStartDelay(0); animation.start(); result = true; } } } return result; }
/** * Animates the visibility of a tab's close button. * * @param viewHolder * The view holder, which holds a reference to the close button, whose visibility should * be animated, as an instance of the class {@link AbstractTabViewHolder}. The view * holder may not be null * @param show * True, if the close button should be shown, false otherwise */ private void animateCloseButtonVisibility(@NonNull final AbstractTabViewHolder viewHolder, final boolean show) { ImageButton closeButton = viewHolder.closeButton; Boolean visible = (Boolean) closeButton.getTag(R.id.tag_visibility); if (visible == null || visible != show) { closeButton.setTag(R.id.tag_visibility, show); if (closeButton.getAnimation() != null) { closeButton.getAnimation().cancel(); } ViewPropertyAnimator animation = closeButton.animate(); animation.setListener(createCloseButtonVisibilityAnimationListener(viewHolder, show)); animation.alpha(show ? 1 : 0); animation.setStartDelay(0); animation.setDuration(closeButtonVisibilityAnimationDuration); animation.start(); } }
/** * Animates a tab to be swiped horizontally. * * @param tabItem * The tab item, which corresponds to the tab, which should be swiped, as an instance of * the class {@link TabItem}. The tab item may not be null * @param targetPosition * The position on the x-axis, the tab should be moved to, in pixels as a {@link Float} * value * @param selected * True, if the tab should become the selected one, false otherwise * @param animationDuration * The duration of the animation in milliseconds as a {@link Long} value * @param velocity * The velocity of the drag gesture, which caused the tab to be swiped, in pixels per * second as a {@link Float} value */ private void animateSwipe(@NonNull final TabItem tabItem, final float targetPosition, final boolean selected, final long animationDuration, final float velocity) { View view = contentViewRecycler.getView(tabItem.getTab()); if (view != null) { float currentPosition = view.getX(); float distance = Math.abs(targetPosition - currentPosition); float maxDistance = getTabSwitcher().getWidth() + swipedTabDistance; long duration = velocity > 0 ? Math.round((distance / velocity) * 1000) : Math.round(animationDuration * (distance / maxDistance)); ViewPropertyAnimator animation = view.animate(); animation.setListener(new AnimationListenerWrapper( selected ? createSwipeSelectedTabAnimationListener(tabItem) : createSwipeNeighborAnimationListener(tabItem))); animation.setInterpolator(new AccelerateDecelerateInterpolator()); animation.setDuration(duration); animation.setStartDelay(0); animation.x(targetPosition); animation.start(); } }
/** * Adapts the visibility of the view, which is shown, when the tab switcher is empty. * * @param animationDuration * The duration of the fade animation, which should be used to show or hide the view, in * milliseconds as a {@link Long} value */ private void adaptEmptyView(final long animationDuration) { detachEmptyView(); if (getModel().isEmpty()) { emptyView = getModel().getEmptyView(); if (emptyView != null) { emptyView.setAlpha(0); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(emptyView.getLayoutParams().width, emptyView.getLayoutParams().height); layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL; getTabSwitcher().addView(emptyView, 0, layoutParams); ViewPropertyAnimator animation = emptyView.animate(); animation.setDuration( animationDuration == -1 ? emptyViewAnimationDuration : animationDuration); animation.alpha(1); animation.start(); } } }
/** * Animates the position and size of a specific tab in order to hide the tab switcher. * * @param item * The item, which corresponds to the tab, which should be animated, as an instance of * the class {@link AbstractItem}. The item may not be null * @param duration * The duration of the animation in milliseconds as a {@link Long} value * @param interpolator * The interpolator, which should be used by the animation, as an instance of the class * {@link Interpolator}. The interpolator may not be null * @param delay * The delay of the animation in milliseconds as a {@link Long} value * @param listener * The listener, which should be notified about the animation's progress, as an instance * of the type {@link AnimatorListener} or null, if no listener should be notified */ private void animateHideSwitcher(@NonNull final AbstractItem item, final long duration, @NonNull final Interpolator interpolator, final long delay, @Nullable final AnimatorListener listener) { View view = item.getView(); animateBottomMargin(view, -(tabInset + tabBorderWidth), duration, delay); ViewPropertyAnimator animation = view.animate(); animation.setDuration(duration); animation.setInterpolator(interpolator); animation.setListener(new AnimationListenerWrapper(listener)); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, 1); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, 1); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); getArithmetics().animatePosition(Axis.ORTHOGONAL_AXIS, animation, item, getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? layoutParams.topMargin : 0); int selectedTabIndex = getModel().getSelectedTabIndex(); if (item.getIndex() < selectedTabIndex) { getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item, getArithmetics().getTabContainerSize(Axis.DRAGGING_AXIS)); } else if (item.getIndex() > selectedTabIndex) { getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item, getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? 0 : layoutParams.topMargin); } else { getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item, getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? 0 : layoutParams.topMargin); } animation.setStartDelay(delay); animation.start(); }
/** * Animates to rotation of all tabs to be reset to normal. * * @param interpolator * The interpolator, which should be used by the animation, as an instance of the type * {@link Interpolator}. The interpolator may not be null * @param maxAngle * The angle, the tabs may be rotated by at maximum, in degrees as a {@link Float} * value * @param listener * The listener, which should be notified about the animation's progress, as an instance * of the type {@link AnimatorListener} or null, if no listener should be notified * @return True, if at least one tab was animated, false otherwise */ private boolean animateTilt(@NonNull final Interpolator interpolator, final float maxAngle, @Nullable final AnimatorListener listener) { ItemIterator iterator = new ItemIterator.Builder(getTabSwitcher(), tabViewRecycler).reverse(true).create(); AbstractItem item; boolean result = false; while ((item = iterator.next()) != null) { if (item.isInflated() && getArithmetics().getRotation(Axis.ORTHOGONAL_AXIS, item) != 0) { View view = item.getView(); ViewPropertyAnimator animation = view.animate(); animation.setListener(new AnimationListenerWrapper( createRevertOvershootAnimationListener(item, !result ? listener : null))); animation.setDuration(Math.round(revertOvershootAnimationDuration * (Math.abs(getArithmetics().getRotation(Axis.ORTHOGONAL_AXIS, item)) / maxAngle))); animation.setInterpolator(interpolator); getArithmetics().animateRotation(Axis.ORTHOGONAL_AXIS, animation, 0); animation.setStartDelay(0); animation.start(); result = true; } } return result; }
/** * Starts a peek animation to add a specific tab. * * @param item * The item, which corresponds to the tab, which should be added, as an instance of the * class {@link AbstractItem}. The item may not be null * @param duration * The duration of the animation in milliseconds as a {@link Long} value * @param interpolator * The interpolator, which should be used by the animation, as an instance of the type * {@link Interpolator}. The interpolator may not be null * @param peekPosition * The position on the dragging axis, the tab should be moved to, in pixels as a {@link * Float} value * @param peekAnimation * The peek animation, which has been used to add the tab, as an instance of the class * {@link PeekAnimation}. The peek animation may not be null */ private void animatePeek(@NonNull final AbstractItem item, final long duration, @NonNull final Interpolator interpolator, final float peekPosition, @NonNull final PeekAnimation peekAnimation) { PhoneTabViewHolder viewHolder = (PhoneTabViewHolder) ((TabItem) item).getViewHolder(); viewHolder.closeButton.setVisibility(View.GONE); View view = item.getView(); float x = peekAnimation.getX(); float y = peekAnimation.getY() + tabTitleContainerHeight; FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); view.setAlpha(1f); getArithmetics().setPivot(Axis.X_AXIS, item, x); getArithmetics().setPivot(Axis.Y_AXIS, item, y); view.setX(layoutParams.leftMargin); view.setY(layoutParams.topMargin); getArithmetics().setScale(Axis.DRAGGING_AXIS, item, 0); getArithmetics().setScale(Axis.ORTHOGONAL_AXIS, item, 0); ViewPropertyAnimator animation = view.animate(); animation.setInterpolator(interpolator); animation.setListener( new AnimationListenerWrapper(createPeekAnimationListener(item, peekAnimation))); animation.setStartDelay(0); animation.setDuration(duration); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, 1); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, 1); getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item, peekPosition, true); animation.start(); int selectedTabIndex = getModel().getSelectedTabIndex(); TabItem selectedItem = TabItem.create(getModel(), tabViewRecycler, selectedTabIndex); tabViewRecycler.inflate(selectedItem); selectedItem.getTag().setPosition(0); PhoneTabViewHolder selectedTabViewHolder = (PhoneTabViewHolder) selectedItem.getViewHolder(); selectedTabViewHolder.closeButton.setVisibility(View.GONE); animateShowSwitcher(selectedItem, duration, interpolator, createZoomOutAnimationListener(selectedItem, peekAnimation)); }
/** * Creates and returns an animation listener, which allows to hide a tab, which has been added * by using a peek animation, when the animation has been ended. * * @param item * The item, which corresponds to the tab, which has been added by using the peek * animation, as an instance of the class {@link AbstractItem}. The item may not be * null * @param peekAnimation * The peek animation as an instance of the class {@link PeekAnimation}. The peek * animation may not be null * @return The listener, which has been created, as an instance of the type {@link * AnimatorListener}. The listener may not be null */ @NonNull private AnimatorListener createPeekAnimationListener(@NonNull final AbstractItem item, @NonNull final PeekAnimation peekAnimation) { return new AnimatorListenerAdapter() { @Override public void onAnimationEnd(final Animator animation) { super.onAnimationEnd(animation); long totalDuration = peekAnimation.getDuration() != -1 ? peekAnimation.getDuration() : peekAnimationDuration; long duration = totalDuration / 3; Interpolator interpolator = peekAnimation.getInterpolator() != null ? peekAnimation.getInterpolator() : new AccelerateDecelerateInterpolator(); View view = item.getView(); getArithmetics().setPivot(Axis.DRAGGING_AXIS, item, tabTitleContainerHeight); getArithmetics().setPivot(Axis.ORTHOGONAL_AXIS, item, getArithmetics().getSize(Axis.ORTHOGONAL_AXIS, item) / 2f); ViewPropertyAnimator animator = view.animate(); animator.setDuration(duration); animator.setStartDelay(duration); animator.setInterpolator(interpolator); animator.setListener( new AnimationListenerWrapper(createRevertPeekAnimationListener(item))); animator.alpha(0); getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animator, item, getArithmetics().getPosition(Axis.DRAGGING_AXIS, item) * 1.5f); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animator, 0); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animator, 0); animator.start(); } }; }
private void buildAndStartAnimation(View view) { ViewPropertyAnimator propertyAnimator = view.animate(); propertyAnimator.alpha(0); propertyAnimator.scaleX(0).scaleY(0); propertyAnimator.setDuration(500l); propertyAnimator.setInterpolator(new LinearInterpolator()); propertyAnimator.start(); }
@OnClick(R.id.adaptive_rotation) public void onAdaptiveRotation() { float targetRotation = animateForward ? 180.0f : 0.0f; float currentRotation = icon.getRotation(); float actualRotationDelta = Math.abs(targetRotation - currentRotation); long duration = (long) (FULL_ANIMATION_DURATION * actualRotationDelta / 180.0f); ViewPropertyAnimator animator = icon.animate(); if (duration < FULL_ANIMATION_DURATION / 2) { animator.setInterpolator(new AccelerateInterpolator()); } else { animator.setInterpolator(new AccelerateDecelerateInterpolator()); } animator .rotation(targetRotation) .setDuration(duration); animateForward = !animateForward; }
@Override public final void animatePosition(@NonNull final Axis axis, @NonNull final ViewPropertyAnimator animator, @NonNull final View view, final float position, final boolean includePadding) { ensureNotNull(axis, "The axis may not be null"); ensureNotNull(animator, "The animator may not be null"); ensureNotNull(view, "The view may not be null"); if (getOrientationInvariantAxis(axis) == Axis.DRAGGING_AXIS) { Toolbar[] toolbars = tabSwitcher.getToolbars(); animator.y((tabSwitcher.areToolbarsShown() && tabSwitcher.isSwitcherShown() && toolbars != null ? toolbars[0].getHeight() - tabInset : 0) + (includePadding ? getPadding(axis, Gravity.START, tabSwitcher) : 0) + position); } else { FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); animator.x(position + layoutParams.leftMargin + (includePadding ? tabSwitcher.getPaddingLeft() / 2f - tabSwitcher.getPaddingRight() / 2f : 0) - (tabSwitcher.getLayout() == Layout.PHONE_LANDSCAPE && tabSwitcher.isSwitcherShown() ? stackedTabCount * stackedTabSpacing / 2f : 0)); } }
@Override public void onBackPressed() { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && isAuthorAnimationRequired) { if (!authorAnimationInProgress) { ViewPropertyAnimator hideAuthorAnimator = com.rozdoum.socialcomponents.utils.AnimationUtils.hideViewByScale(authorImageView); hideAuthorAnimator.setListener(authorAnimatorListener); hideAuthorAnimator.withEndAction(new Runnable() { @Override public void run() { PostDetailsActivity.super.onBackPressed(); } }); } } else { super.onBackPressed(); } }
@Override public void dismiss() { final ViewPropertyAnimator animator = mOverlayView.animate().alpha(0); mLayout.setPivotY(0); mLayout.animate().scaleY(0).setDuration(ANIMATION_DURATION); ViewUtil.runOnAnimationEnd(animator, new Runnable() { @Override public void run() { dismissRightAway(); } }); animator.start(); }
/** * Creates and returns an animation listener, which allows to hide a tab, which has been added * by using a peek animation, when the animation has been ended. * * @param tabItem * The tab item, which corresponds to the tab, which has been added by using the peek * animation, as an instance of the class {@link TabItem}. The tab item may not be null * @param peekAnimation * The peek animation as an instance of the class {@link PeekAnimation}. The peek * animation may not be null * @return The listener, which has been created, as an instance of the type {@link * AnimatorListener}. The listener may not be null */ @NonNull private AnimatorListener createPeekAnimationListener(@NonNull final TabItem tabItem, @NonNull final PeekAnimation peekAnimation) { return new AnimatorListenerAdapter() { @Override public void onAnimationEnd(final Animator animation) { super.onAnimationEnd(animation); long totalDuration = peekAnimation.getDuration() != -1 ? peekAnimation.getDuration() : peekAnimationDuration; long duration = totalDuration / 3; Interpolator interpolator = peekAnimation.getInterpolator() != null ? peekAnimation.getInterpolator() : new AccelerateDecelerateInterpolator(); View view = tabItem.getView(); getArithmetics().setPivot(Axis.DRAGGING_AXIS, view, tabTitleContainerHeight); getArithmetics().setPivot(Axis.ORTHOGONAL_AXIS, view, getArithmetics().getSize(Axis.ORTHOGONAL_AXIS, view) / 2f); ViewPropertyAnimator animator = view.animate(); animator.setDuration(duration); animator.setStartDelay(duration); animator.setInterpolator(interpolator); animator.setListener( new AnimationListenerWrapper(createRevertPeekAnimationListener(tabItem))); animator.alpha(0); getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animator, view, getArithmetics().getPosition(Axis.DRAGGING_AXIS, view) * 1.5f, false); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animator, 0); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animator, 0); animator.start(); } }; }
/** * Animates the position, size and alpha of a specific tab item in order to swipe it * orthogonally. * * @param tabItem * The tab item, which should be animated, as an instance of the class {@link TabItem}. * The tab item may not be null * @param remove * True, if the tab should be removed after the animation has finished, false otherwise * @param delay * The delay after which the animation should be started in milliseconds as a {@link * Long} value * @param swipeAnimation * The animation, which should be used, as an instance of the class {@link * SwipeAnimation}. The animation may not be null * @param listener * The listener, which should be notified about the progress of the animation, as an * instance of the type {@link AnimatorListener} or null, if no listener should be * notified */ private void animateSwipe(@NonNull final TabItem tabItem, final boolean remove, final long delay, @NonNull final SwipeAnimation swipeAnimation, @Nullable final AnimatorListener listener) { View view = tabItem.getView(); float currentScale = getArithmetics().getScale(view, true); float swipePosition = calculateSwipePosition(); float targetPosition = remove ? (swipeAnimation.getDirection() == SwipeDirection.LEFT ? -1 * swipePosition : swipePosition) : 0; float currentPosition = getArithmetics().getPosition(Axis.ORTHOGONAL_AXIS, view); float distance = Math.abs(targetPosition - currentPosition); long animationDuration = swipeAnimation.getDuration() != -1 ? swipeAnimation.getDuration() : Math.round(swipeAnimationDuration * (distance / swipePosition)); ViewPropertyAnimator animation = view.animate(); animation.setInterpolator( swipeAnimation.getInterpolator() != null ? swipeAnimation.getInterpolator() : new AccelerateDecelerateInterpolator()); animation.setListener(new AnimationListenerWrapper(listener)); animation.setDuration(animationDuration); getArithmetics() .animatePosition(Axis.ORTHOGONAL_AXIS, animation, view, targetPosition, true); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, remove ? swipedTabScale * currentScale : currentScale); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, remove ? swipedTabScale * currentScale : currentScale); animation.alpha(remove ? swipedTabAlpha : 1); animation.setStartDelay(delay); animation.start(); }
public void applyPreview(Bitmap bitmap, boolean animate) { if (bitmap != null) { mWidgetImage.setBitmap(bitmap, DrawableFactory.get(getContext()).getBadgeForUser(mItem.user, getContext())); if (mAnimatePreview) { mWidgetImage.setAlpha(0f); ViewPropertyAnimator anim = mWidgetImage.animate(); anim.alpha(1.0f).setDuration(FADE_IN_DURATION_MS); } else { mWidgetImage.setAlpha(1f); } } }
/** */ @Override void showProgressBar(SearchView searchView) { final View icon = searchView.mButtonIcon; final ViewPropertyAnimator iconAnimator = icon.animate(); iconAnimator.setListener(null); iconAnimator.cancel(); iconAnimator .scaleX(0.5f) .scaleY(0.5f) .alpha(0.0f) .setDuration(UiConfig.ANIMATION_DURATION_MEDIUM) .setInterpolator(iconInterpolator) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { icon.setVisibility(View.INVISIBLE); } }) .start(); final CircularProgressBar progressBar = searchView.mProgressBar; final ViewPropertyAnimator progressBarAnimator = progressBar.animate(); progressBarAnimator.setListener(null); progressBarAnimator.cancel(); progressBar.setAlpha(0.0f); progressBar.setVisibility(View.VISIBLE); progressBarAnimator .alpha(1.0f) .setDuration(UiConfig.ANIMATION_DURATION_MEDIUM) .setListener(null) .start(); }
private ViewPropertyAnimator animateOffScreenLeft(int duration) { return card.animate() .setDuration(duration) .x(-(parent.getWidth())) .y(0) .rotation(-30); }
private ViewPropertyAnimator animateOffScreenRight(int duration) { return card.animate() .setDuration(duration) .x(parent.getWidth() * 2) .y(0) .rotation(30); }
void updateText(final TextView textView, final int updatedTextResId, int startDelay, final Runnable endAction) { ViewPropertyAnimator animator = textView.animate().alpha(0.0f).setDuration(250).setStartDelay((long) startDelay).withEndAction(new Runnable() { public void run() { textView.setText(updatedTextResId); ViewPropertyAnimator animator2 = textView.animate().alpha(DefaultRetryPolicy.DEFAULT_BACKOFF_MULT).setStartDelay(200).setDuration(500); if (endAction != null) { animator2.withEndAction(endAction); } } }); }
@Override public final void animatePosition(@NonNull final Axis axis, @NonNull final ViewPropertyAnimator animator, @NonNull final AbstractItem item, final float position, final boolean includePadding) { throw new UnsupportedOperationException(); }
private void hide(final View view) { ViewPropertyAnimator animator = view.animate().translationY(0).setInterpolator(new FastOutSlowInInterpolator()).setDuration(200); animator.setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { view.setVisibility(View.GONE); } }); animator.start(); }
@Override public final void animatePosition(@NonNull final Axis axis, @NonNull final ViewPropertyAnimator animator, @NonNull final AbstractItem item, final float position, final boolean includePadding) { ensureNotNull(axis, "The axis may not be null"); ensureNotNull(animator, "The animator may not be null"); ensureNotNull(item, "The item may not be null"); if (getOrientationInvariantAxis(axis) == Axis.DRAGGING_AXIS) { Toolbar[] toolbars = getTabSwitcher().getToolbars(); animator.y((getTabSwitcher().areToolbarsShown() && getTabSwitcher().isSwitcherShown() && toolbars != null ? toolbars[TabSwitcher.PRIMARY_TOOLBAR_INDEX].getHeight() - tabInset : 0) + (includePadding ? getTabSwitcherPadding(axis, Gravity.START) : 0) + position); } else { View view = item.getView(); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); animator.x(position + layoutParams.leftMargin + (includePadding ? getTabSwitcher().getPaddingLeft() / 2f - getTabSwitcher().getPaddingRight() / 2f : 0) - (getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE && getTabSwitcher().isSwitcherShown() ? stackedTabCount * stackedTabSpacing / 2f : 0)); } }
@Override public final void animateScale(@NonNull final Axis axis, @NonNull final ViewPropertyAnimator animator, final float scale) { ensureNotNull(axis, "The axis may not be null"); ensureNotNull(animator, "The animator may not be null"); if (getOrientationInvariantAxis(axis) == Axis.DRAGGING_AXIS) { animator.scaleY(scale); } else { animator.scaleX(scale); } }
@Override public final void animateRotation(@NonNull final Axis axis, @NonNull final ViewPropertyAnimator animator, final float angle) { ensureNotNull(axis, "The axis may not be null"); ensureNotNull(animator, "The animator may not be null"); if (getOrientationInvariantAxis(axis) == Axis.DRAGGING_AXIS) { animator.rotationY( getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? -1 * angle : angle); } else { animator.rotationX( getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? -1 * angle : angle); } }
/** * Animates the position and size of a specific tab in order to show the tab switcher. * * @param item * The item, which corresponds to the tab, which should be animated, as an instance of * the class {@link AbstractItem}. The item may not be null * @param duration * The duration of the animation in milliseconds as a {@link Long} value * @param interpolator * The interpolator, which should be used by the animation, as an instance of the type * {@link Interpolator}. The interpolator may not be null * @param listener * The listener, which should be notified about the animation's progress, as an instance * of the type {@link AnimatorListener} or null, if no listener should be notified */ private void animateShowSwitcher(@NonNull final AbstractItem item, final long duration, @NonNull final Interpolator interpolator, @Nullable final AnimatorListener listener) { View view = item.getView(); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); view.setX(layoutParams.leftMargin); view.setY(layoutParams.topMargin); getArithmetics().setScale(Axis.DRAGGING_AXIS, item, 1); getArithmetics().setScale(Axis.ORTHOGONAL_AXIS, item, 1); getArithmetics().setPivot(Axis.DRAGGING_AXIS, item, getArithmetics().getPivot(Axis.DRAGGING_AXIS, item, DragState.NONE)); getArithmetics().setPivot(Axis.ORTHOGONAL_AXIS, item, getArithmetics().getPivot(Axis.ORTHOGONAL_AXIS, item, DragState.NONE)); float scale = getArithmetics().getScale(item, true); int selectedTabIndex = getModel().getSelectedTabIndex(); if (item.getIndex() < selectedTabIndex) { getArithmetics().setPosition(Axis.DRAGGING_AXIS, item, getArithmetics().getTabContainerSize(Axis.DRAGGING_AXIS)); } else if (item.getIndex() > selectedTabIndex) { getArithmetics().setPosition(Axis.DRAGGING_AXIS, item, getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? 0 : layoutParams.topMargin); } if (tabViewBottomMargin == -1) { tabViewBottomMargin = calculateBottomMargin(item); } animateBottomMargin(view, tabViewBottomMargin, duration, 0); ViewPropertyAnimator animation = view.animate(); animation.setDuration(duration); animation.setInterpolator(interpolator); animation.setListener(new AnimationListenerWrapper(listener)); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, scale); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, scale); getArithmetics() .animatePosition(Axis.DRAGGING_AXIS, animation, item, item.getTag().getPosition(), true); getArithmetics().animatePosition(Axis.ORTHOGONAL_AXIS, animation, item, 0, true); animation.setStartDelay(0); animation.start(); }
/** * Animates the position, size and alpha of a specific tab in order to swipe it * orthogonally. * * @param item * The item, corresponds to the tab, which should be animated, as an instance of the * class {@link AbstractItem}. The item may not be null * @param remove * True, if the tab should be removed after the animation has finished, false otherwise * @param delayMultiplier * The multiplied, which should be used to calculate the delay after which the animation * should be started, by being multiplied with the default delay, as an {@link Integer} * value * @param swipeAnimation * The animation, which should be used, as an instance of the class {@link * SwipeAnimation}. The animation may not be null * @param listener * The listener, which should be notified about the progress of the animation, as an * instance of the type {@link AnimatorListener} or null, if no listener should be * notified */ private void animateSwipe(@NonNull final AbstractItem item, final boolean remove, final int delayMultiplier, @NonNull final SwipeAnimation swipeAnimation, @Nullable final AnimatorListener listener) { View view = item.getView(); float currentScale = getArithmetics().getScale(item, true); float swipePosition = calculateSwipePosition(); float targetPosition = remove ? (swipeAnimation.getDirection() == SwipeDirection.LEFT_OR_TOP ? -1 * swipePosition : swipePosition) : 0; float currentPosition = getArithmetics().getPosition(Axis.ORTHOGONAL_AXIS, item); float distance = Math.abs(targetPosition - currentPosition); long animationDuration = swipeAnimation.getDuration() != -1 ? swipeAnimation.getDuration() : Math.round(swipeAnimationDuration * (distance / swipePosition)); ViewPropertyAnimator animation = view.animate(); animation.setInterpolator( swipeAnimation.getInterpolator() != null ? swipeAnimation.getInterpolator() : new AccelerateDecelerateInterpolator()); animation.setListener(new AnimationListenerWrapper(listener)); animation.setDuration(animationDuration); getArithmetics() .animatePosition(Axis.ORTHOGONAL_AXIS, animation, item, targetPosition, true); getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, remove ? swipedTabScale * currentScale : currentScale); getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, remove ? swipedTabScale * currentScale : currentScale); animation.alpha(remove ? swipedTabAlpha : 1); animation.setStartDelay(delayMultiplier * calculateAnimationDelay(animationDuration)); animation.start(); }