Improve new posts button animation

This commit is contained in:
Grishka
2023-10-18 01:37:02 +03:00
parent 201b72c9c8
commit e525aef3d9
2 changed files with 40 additions and 43 deletions

View File

@@ -4,11 +4,9 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.animation.StateListAnimator;
import android.app.Activity; import android.app.Activity;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@@ -70,7 +68,7 @@ public class HomeTimelineFragment extends StatusListFragment implements ToolbarD
private FixedAspectRatioImageView listsDropdownArrow; private FixedAspectRatioImageView listsDropdownArrow;
private TextView listsDropdownText; private TextView listsDropdownText;
private Button newPostsBtn; private Button newPostsBtn;
private StateListAnimator newPostsBtnStateAnimator; private View newPostsBtnWrap;
private boolean newPostsBtnShown; private boolean newPostsBtnShown;
private AnimatorSet currentNewPostsAnim; private AnimatorSet currentNewPostsAnim;
private ToolbarDropdownMenuController dropdownController; private ToolbarDropdownMenuController dropdownController;
@@ -195,17 +193,16 @@ public class HomeTimelineFragment extends StatusListFragment implements ToolbarD
fab.setOnClickListener(this::onFabClick); fab.setOnClickListener(this::onFabClick);
newPostsBtn=view.findViewById(R.id.new_posts_btn); newPostsBtn=view.findViewById(R.id.new_posts_btn);
newPostsBtn.setOnClickListener(this::onNewPostsBtnClick); newPostsBtn.setOnClickListener(this::onNewPostsBtnClick);
newPostsBtnStateAnimator=newPostsBtn.getStateListAnimator(); newPostsBtnWrap=view.findViewById(R.id.new_posts_btn_wrap);
if(newPostsBtnShown){ if(newPostsBtnShown){
newPostsBtn.setVisibility(View.VISIBLE); newPostsBtnWrap.setVisibility(View.VISIBLE);
}else{ }else{
newPostsBtn.setVisibility(View.GONE); newPostsBtnWrap.setVisibility(View.GONE);
newPostsBtn.setStateListAnimator(null); newPostsBtnWrap.setScaleX(0.9f);
newPostsBtn.setScaleX(0.9f); newPostsBtnWrap.setScaleY(0.9f);
newPostsBtn.setScaleY(0.9f); newPostsBtnWrap.setAlpha(0f);
newPostsBtn.setAlpha(0f); newPostsBtnWrap.setTranslationY(V.dp(-56));
newPostsBtn.setTranslationY(V.dp(-56));
} }
updateToolbarLogo(); updateToolbarLogo();
list.addOnScrollListener(new RecyclerView.OnScrollListener(){ list.addOnScrollListener(new RecyclerView.OnScrollListener(){
@@ -500,13 +497,13 @@ public class HomeTimelineFragment extends StatusListFragment implements ToolbarD
if(currentNewPostsAnim!=null){ if(currentNewPostsAnim!=null){
currentNewPostsAnim.cancel(); currentNewPostsAnim.cancel();
} }
newPostsBtn.setVisibility(View.VISIBLE); newPostsBtnWrap.setVisibility(View.VISIBLE);
AnimatorSet set=new AnimatorSet(); AnimatorSet set=new AnimatorSet();
set.playTogether( set.playTogether(
ObjectAnimator.ofFloat(newPostsBtn, View.ALPHA, 1f), ObjectAnimator.ofFloat(newPostsBtnWrap, View.ALPHA, 1f),
ObjectAnimator.ofFloat(newPostsBtn, View.SCALE_X, 1f), ObjectAnimator.ofFloat(newPostsBtnWrap, View.SCALE_X, 1f),
ObjectAnimator.ofFloat(newPostsBtn, View.SCALE_Y, 1f), ObjectAnimator.ofFloat(newPostsBtnWrap, View.SCALE_Y, 1f),
ObjectAnimator.ofFloat(newPostsBtn, View.TRANSLATION_Y, 0f) ObjectAnimator.ofFloat(newPostsBtnWrap, View.TRANSLATION_Y, 0f)
); );
set.setDuration(getResources().getInteger(R.integer.m3_sys_motion_duration_medium3)); set.setDuration(getResources().getInteger(R.integer.m3_sys_motion_duration_medium3));
set.setInterpolator(AnimationUtils.loadInterpolator(getActivity(), R.interpolator.m3_sys_motion_easing_standard_decelerate)); set.setInterpolator(AnimationUtils.loadInterpolator(getActivity(), R.interpolator.m3_sys_motion_easing_standard_decelerate));
@@ -514,7 +511,6 @@ public class HomeTimelineFragment extends StatusListFragment implements ToolbarD
@Override @Override
public void onAnimationEnd(Animator animation){ public void onAnimationEnd(Animator animation){
currentNewPostsAnim=null; currentNewPostsAnim=null;
newPostsBtn.setStateListAnimator(newPostsBtnStateAnimator);
} }
}); });
currentNewPostsAnim=set; currentNewPostsAnim=set;
@@ -528,23 +524,19 @@ public class HomeTimelineFragment extends StatusListFragment implements ToolbarD
if(currentNewPostsAnim!=null){ if(currentNewPostsAnim!=null){
currentNewPostsAnim.cancel(); currentNewPostsAnim.cancel();
} }
float scale=newPostsBtn.getScaleX();
float alpha=newPostsBtn.getAlpha();
newPostsBtnStateAnimator.jumpToCurrentState();
newPostsBtn.setStateListAnimator(null);
AnimatorSet set=new AnimatorSet(); AnimatorSet set=new AnimatorSet();
set.playTogether( set.playTogether(
ObjectAnimator.ofFloat(newPostsBtn, View.ALPHA, alpha, 0f), ObjectAnimator.ofFloat(newPostsBtnWrap, View.ALPHA, 0f),
ObjectAnimator.ofFloat(newPostsBtn, View.SCALE_X, scale, scale*.9f), ObjectAnimator.ofFloat(newPostsBtnWrap, View.SCALE_X, .9f),
ObjectAnimator.ofFloat(newPostsBtn, View.SCALE_Y, scale, scale*.9f), ObjectAnimator.ofFloat(newPostsBtnWrap, View.SCALE_Y, .9f),
ObjectAnimator.ofFloat(newPostsBtn, View.TRANSLATION_Y, V.dp(-56)) ObjectAnimator.ofFloat(newPostsBtnWrap, View.TRANSLATION_Y, V.dp(-56))
); );
set.setDuration(getResources().getInteger(R.integer.m3_sys_motion_duration_medium3)); set.setDuration(getResources().getInteger(R.integer.m3_sys_motion_duration_medium3));
set.setInterpolator(AnimationUtils.loadInterpolator(getActivity(), R.interpolator.m3_sys_motion_easing_standard_accelerate)); set.setInterpolator(AnimationUtils.loadInterpolator(getActivity(), R.interpolator.m3_sys_motion_easing_standard_accelerate));
set.addListener(new AnimatorListenerAdapter(){ set.addListener(new AnimatorListenerAdapter(){
@Override @Override
public void onAnimationEnd(Animator animation){ public void onAnimationEnd(Animator animation){
newPostsBtn.setVisibility(View.GONE); newPostsBtnWrap.setVisibility(View.GONE);
currentNewPostsAnim=null; currentNewPostsAnim=null;
} }
}); });

View File

@@ -34,24 +34,29 @@
android:contentDescription="@string/new_post" android:contentDescription="@string/new_post"
android:src="@drawable/ic_edit_24px"/> android:src="@drawable/ic_edit_24px"/>
<Button <FrameLayout
android:id="@+id/new_posts_btn" android:id="@+id/new_posts_btn_wrap"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="40dp" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top" android:layout_gravity="center_horizontal|top">
android:layout_marginTop="16dp" <Button
android:background="@drawable/round_rect" android:id="@+id/new_posts_btn"
android:backgroundTint="?colorM3Primary" android:layout_width="wrap_content"
android:paddingHorizontal="16dp" android:layout_height="40dp"
android:paddingVertical="0dp" android:layout_margin="16dp"
android:textAppearance="@style/m3_label_large" android:background="@drawable/round_rect"
android:textColor="?colorM3OnPrimary" android:backgroundTint="?colorM3Primary"
android:drawableStart="@drawable/ic_arrow_upward_24px" android:paddingHorizontal="16dp"
android:drawableTint="?colorM3OnPrimary" android:paddingVertical="0dp"
android:drawablePadding="8dp" android:textAppearance="@style/m3_label_large"
android:elevation="@dimen/m3_sys_elevation_level4" android:textColor="?colorM3OnPrimary"
android:stateListAnimator="@animator/squish" android:drawableStart="@drawable/ic_arrow_upward_24px"
android:text="@string/see_new_posts"/> android:drawableTint="?colorM3OnPrimary"
android:drawablePadding="8dp"
android:elevation="@dimen/m3_sys_elevation_level4"
android:stateListAnimator="@animator/squish"
android:text="@string/see_new_posts"/>
</FrameLayout>
</FrameLayout> </FrameLayout>
</me.grishka.appkit.views.RecursiveSwipeRefreshLayout> </me.grishka.appkit.views.RecursiveSwipeRefreshLayout>