12

Sto utilizzando il componente del pulsante di azione mobile (fab) dalla libreria com.android.support:design:23.1.0 per generare i fabs della mia app.fab.show() non viene animato per la prima volta dopo l'inizializzazione della nuova attività

Ma la prima volta che carico una nuova attività con fab.hide() e provo a rendere visibile l'icona tramite fab.show() dopo aver fatto clic su un pulsante, non c'è animazione per il fab. Questo accade solo la prima volta dopo aver caricato una nuova attività. Quando provo più volte per nascondere e mostrare il pulsante, è animato correttamente.

Qual è il problema qui? Sarebbe un vero piacere animarlo anche subito dopo aver caricato un'attività.

Java in attività:

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

risposta

4

Risolto questo fine. Ho progettato una nuova classe per gestire l'animazione di rivelazione con un ritardo. Prendilo qui, inizializzalo e sei a posto. Ho trovato un'animazione piuttosto simile allo standard fab.show() con un ritardo di 50 ms.

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

Secondo documenti:

android.support.design.widget.FloatingActionButton

pubblico void show()

mostra il pulsante. Questo metodo animerà il pulsante show se la vista è già stata impostata.

Quindi, per rendere animare la prima volta è possibile scrivere la propria animazione animare quando non è attualmente disposto

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

Ho avuto lo stesso problema. Nel mio fab xml avevo visibility="gone", che ho provato a mostrare il codice dal fab.show() - e l'animazione non funzionava la prima volta. Ho modificato xml a visibility="invisible" e il problema è stato risolto.

+1

Funziona! Grazie – cgr

+1

Questa dovrebbe essere la risposta accettata. Un'altra cosa, anche se non hai 'visibility =" gone "', dovresti impostare 'visibility =" invisible "'. –

Problemi correlati