Android中Floating Action Button二次点击无法设为INVISIBLE/GONE
问题现象
- 首次点击
add_btn时功能运行正常:动画可正常播放,其余悬浮按钮可正常切换为可见状态。
- 第二次点击
add_btn时,关闭动画可正常播放,但其余按钮无法切换为INVISIBLE/GONE隐藏状态。
现有实现代码
按钮控制Java代码
addFloatingBtn.setOnClickListener(view -> { if (!isFloatingActionBtnVisible){ // 显示按钮 addVideoFloatingBtn.setVisibility(View.VISIBLE); addNotesFloatingBtn.setVisibility(View.VISIBLE); // 播放展开动画 addVideoFloatingBtn.startAnimation(fromBottom); addNotesFloatingBtn.startAnimation(fromBottom); addFloatingBtn.startAnimation(rotateOpen); isFloatingActionBtnVisible = true; Toast.makeText(getContext(), "Animation Added", Toast.LENGTH_SHORT).show(); }else { // 播放关闭动画 addVideoFloatingBtn.startAnimation(toBottom); addNotesFloatingBtn.startAnimation(toBottom); addFloatingBtn.startAnimation(rotateClose); // 隐藏按钮 addVideoFloatingBtn.setVisibility(View.GONE); addNotesFloatingBtn.setVisibility(View.GONE); isFloatingActionBtnVisible = false; } });
XML布局代码
<com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/add_floating_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginBottom="16dp" android:clickable="true" android:src="@drawable/ic_add" android:tint="@color/white" android:background="@color/purple_500" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" android:focusable="true" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/add_video_floating_btn" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginBottom="16dp" android:clickable="true" android:src="@drawable/ic_add_video" android:visibility="invisible" app:layout_constraintBottom_toTopOf="@+id/add_floating_btn" app:layout_constraintEnd_toEndOf="@+id/add_floating_btn" app:layout_constraintStart_toStartOf="@+id/add_floating_btn" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/add_notes_floating_btn" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginBottom="16dp" android:clickable="true" android:src="@drawable/ic_notes" android:visibility="invisible" app:layout_constraintBottom_toTopOf="@+id/add_video_floating_btn" app:layout_constraintEnd_toEndOf="@+id/add_video_floating_btn" app:layout_constraintStart_toStartOf="@+id/add_video_floating_btn" />
问题原因
启动关闭动画的同时立刻调用setVisibility()修改可见性,此时退出动画还未执行完成,动画持有的视图绘制状态会覆盖设置的可见性属性,最终导致按钮无法正常隐藏。
修复方案
给关闭动画设置状态监听器,等动画完全播放结束后再修改按钮可见性,修改后的else分支代码如下:
else { // 播放关闭动画 addVideoFloatingBtn.startAnimation(toBottom); addNotesFloatingBtn.startAnimation(toBottom); addFloatingBtn.startAnimation(rotateClose); // 监听动画播放状态,动画结束后再执行隐藏逻辑 toBottom.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) {} @Override public void onAnimationEnd(Animation animation) { addVideoFloatingBtn.setVisibility(View.GONE); addNotesFloatingBtn.setVisibility(View.GONE); isFloatingActionBtnVisible = false; } @Override public void onAnimationRepeat(Animation animation) {} }); }
如果需要实现INVISIBLE隐藏效果,将上述代码中的View.GONE替换为View.INVISIBLE即可。
内容的提问来源于stack exchange,提问作者Hammad Zafar Bawara
相关产品推荐
相关产品推荐

