12

Używam składnika ruchomego przycisku akcji (fab) z biblioteki com.android.support:design:23.1.0 do generowania plików z aplikacjami mojej aplikacji.fab.show() nie animowane po raz pierwszy po zainicjowaniu nowej aktywności

Ale po raz pierwszy ładuję nową aktywność z fab.hide() i próbuję uczynić ikonę widoczną przez fab.show() po kliknięciu przycisku, nie ma animacji dla fab. Dzieje się tak tylko po raz pierwszy po załadowaniu nowej aktywności. Kiedy próbuję to wiele razy, aby ukryć i pokazać przycisk, jest on odpowiednio animowany.

Na czym polega problem? Byłoby uroku, aby animować go zaraz po załadowaniu aktywności.

Java aktywności:

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

Odpowiedz

4

wreszcie rozwiązać ten jeden. Zaprojektowałem nową klasę do obsługi animacji z opóźnieniem. Chwyć to tutaj, zainicjuj i jesteś gotowy. Znalazłem całkiem podobną animację do standardowego fab.show() z opóźnieniem 50ms.

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

Według docs:

android.support.design.widget.FloatingActionButton

public void show()

Pokazuje przycisk. Ta metoda spowoduje animację przycisku show , jeśli widok został już ułożony.

Tak, aby animować po raz pierwszy można pisać jesteś właścicielem animację, aby ją animować, gdy nie jest obecnie rozplanowane

/** 
* 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

miałem ten sam problem. W moim fabularnym xml miałem visibility="gone", niż próbowałem pokazać fab z kodu przez fab.show() - animacja nie działała za pierwszym razem. Zmieniono xml na visibility="invisible" i problem został rozwiązany.

+1

To działa! Dzięki – cgr

+1

To powinna być zaakceptowana odpowiedź. Inną rzeczą, nawet jeśli nie masz "visibility =" gone "", powinieneś ustawić 'visibility =" niewidoczny "'. –

Powiązane problemy