Подтвердить что ты не робот

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" />
4b9b3361

Ответ 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());
    }
}