Fab.show() не анимируется в первый раз после инициализации новой активности
Я использую компонент плавающей операции (fab) из библиотеки com.android.support:design:23.1.0 для создания приложений.
Но в первый раз, когда я загружаю новое действие с помощью fab.hide() и пытаюсь сделать значок видимым через fab.show() после нажатия кнопки, анимации для fab нет. Это происходит только в первый раз после загрузки нового действия. Когда я пытаюсь несколько раз скрывать и показывать кнопку, она анимируется должным образом.
В чем проблема? Было бы прелести, чтобы получить анимацию сразу после загрузки активности.
Java в действии:
fabSend = (FloatingActionButton) findViewById(R.id.fabSend);
fabSend.hide();
CompoundButton.OnCheckedChangeListener changeChecker = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
// FAB on
fabSend.show();
} else {
// FAB off
fabSend.hide();
}
}
};
layout.xml
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabSend"
app:borderWidth="0dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_alignParentBottom="true"
android:layout_marginRight="@dimen/fab_margin"
android:layout_marginBottom="54dp"
android:src="@drawable/ic_check_white_24dp" />
Ответы
Ответ 1
Решила это наконец. Я разработал новый класс для обработки анимации раскрытия с задержкой. Возьмите его здесь, инициализируйте его, и вы хорошо пойдете. Я нашел довольно похожую анимацию для стандартного fab.show() с задержкой 50 мс.
public static void showFabWithAnimation(final FloatingActionButton fab, final int delay) {
fab.setVisibility(View.INVISIBLE);
fab.setScaleX(0.0F);
fab.setScaleY(0.0F);
fab.setAlpha(0.0F);
fab.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
fab.getViewTreeObserver().removeOnPreDrawListener(this);
fab.postDelayed(new Runnable() {
@Override
public void run() {
fab.show();
}
}, delay);
return true;
}
});
}
Ответ 2
У меня была такая же проблема. В моем fab xml у меня был visibility="gone"
, чем я пытался показать fab из кода fab.show()
- и анимация не работала в первый раз. Я изменил xml на visibility="invisible"
, и проблема была решена.
Ответ 3
Согласно документам:
android.support.design.widget.FloatingActionButton
public void show()
Показывает кнопку. Этот метод будет анимировать кнопку show , если вид уже сделан.
Итак, чтобы сделать его анимированным в первый раз, вы можете написать свою собственную анимацию, чтобы оживить ее, когда она не выкладывается в текущий момент
/**
* Unlike {@link FloatingActionButton#show()} animates button even it not currently
* laid out
* @param fab fab to show
*/
@SuppressLint("NewApi")
public static void show(FloatingActionButton fab) {
if (ViewCompat.isLaidOut(fab) ||
Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
fab.show();
} else {
fab.animate().cancel();//cancel all animations
fab.setScaleX(0f);
fab.setScaleY(0f);
fab.setAlpha(0f);
fab.setVisibility(View.VISIBLE);
//values from support lib source code
fab.animate().setDuration(200).scaleX(1).scaleY(1).alpha(1)
.setInterpolator(new LinearOutSlowInInterpolator());
}
}