12

Ich verwende die Floating-Action-Schaltfläche (fab) Komponente von com.android.support:design:23.1.0 Bibliothek, um meine Fabs zu generieren.fab.show() nicht animiert das erste Mal nach der Initialisierung neuer Aktivität

Aber das erste Mal, wenn ich eine neue Aktivität mit fab.hide() lade und versuche, das Symbol durch fab.show() sichtbar zu machen, nachdem eine Schaltfläche angeklickt wurde, gibt es keine Animation für die Fab. Dies geschieht erst beim ersten Mal nach dem Laden einer neuen Aktivität. Wenn ich das mehrmals versuche, den Knopf zu verstecken und zu zeigen, wird er richtig animiert.

Was ist das Problem hier? Es wäre ein Reiz, es auch direkt nach dem Laden einer Aktivität zu animieren.

Java in Aktion:

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

Antwort

4

diese eine endlich gelöst. Ich entwarf eine neue Klasse, um die Enthüllungsanimation mit einer Verzögerung zu behandeln. Nimm es hier, initialisiere es und du bist gut zu gehen. Ich fand eine ziemlich ähnliche Animation zum Standard fab.show() mit 50ms Verzögerung.

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

docs nach:

android.support.design.widget.FloatingActionButton

public void show()

Zeigt die Taste. Diese Methode animiert die Schaltfläche show , wenn die Ansicht bereits ausgelegt wurde.

Also, um es zum ersten Mal animieren Sie Animation es zu animieren besitzen schreiben kann, wenn es nicht zur Zeit

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

Ich habe das gleiche Problem hatte. In meinem fab xml hatte ich visibility="gone", als ich versucht, fab aus dem Code von fab.show() zu zeigen - und Animation funktionierte nicht das erste Mal. Ich habe Xml in visibility="invisible" geändert und Problem wurde gelöst.

+1

Es funktioniert! Danke – cgr

+1

Dies sollte die akzeptierte Antwort sein. Eine andere Sache, selbst wenn Sie "Sichtbarkeit =" nicht "" haben, sollten Sie 'Sichtbarkeit =" unsichtbar "' setzen. –

Verwandte Themen