12

Я использую компонент плавающей кнопки действия (fab) из com.android.support:design:23.1.0. Библиотека для создания приложений моего приложения.fab.show() не анимируется в первый раз после инициализации новой активности

Но в первый раз, когда я загружаю новое действие с помощью функции 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" /> 

ответ

4

решаемые этот окончательно. Я разработал новый класс для обработки анимации раскрытия с задержкой. Возьмите его здесь, инициализируйте его, и вы хорошо пойдете. Я нашел довольно похожую анимацию для стандартного 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; 
     } 
    }); 
} 
0

Согласно документации:

android.support.design.widget.FloatingActionButton

общественного недействительными шоу()

Показывает кнопку. Этот метод будет анимировать кнопку 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()); 
    } 
} 
14

У меня была та же проблема. В моем fab xml у меня был visibility="gone", чем я пытался показать fab от кода fab.show() - и анимация не работала в первый раз. Я изменил xml на visibility="invisible", и проблема была решена.

+1

Это работает! Спасибо – cgr

+1

Это должен быть принятый ответ. Другое дело, даже если у вас нет 'visibility =" gone "', вы должны установить 'visibility =" invisible "'. –

Смежные вопросы