android - tag - fab.show() no se animó por primera vez después de inicializar una nueva actividad
tag android studio (4)
Estoy utilizando el componente de botón de acción flotante (fab) de la biblioteca com.android.support:design:23.1.0 para generar los fabs de mi aplicación.
Pero la primera vez que cargo una nueva actividad con fab.hide () y trato de hacer visible el icono a través de fab.show () después de hacer clic en un botón, no hay animación para la fab. Esto sucede solo la primera vez después de cargar una nueva actividad. Cuando lo intento varias veces para ocultar y mostrar el botón, está animado correctamente.
Cuál es el problema aquí? Sería un encanto hacerlo animado también justo después de cargar una actividad.
Java en actividad:
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" />
He tenido el mismo problema. En mi xml fab tuve visibility="gone"
, de lo que intenté mostrar fab desde el código de fab.show()
- y la animación no fab.show()
la primera vez. He cambiado xml a visibility="invisible"
y el problema se resolvió.
La mejor manera de lograrlo es simplemente configurando la escala de su Fab de X y escalaY en cero en XML. Es el método más fácil y también deja limpio el código de su aplicación.
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleX="0"
android:scaleY="0"
android:visibility="invisible"/>
Resuelto éste finalmente. Diseñé una nueva clase para manejar la animación reveladora con un retraso. Agárralo aquí, inicialízalo y listo. Encontré una animación bastante similar a la fab.show () estándar a 50 ms de retraso.
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;
}
});
}
Según los documentos:
android.support.design.widget.FloatingActionButton
espectáculo de vacío público ()
Muestra el botón. Este método animará el botón mostrar si la vista ya se ha distribuido .
Entonces, para que sea animado la primera vez que puedes escribir tu propia animación para animarla cuando no está diseñada actualmente
/**
* 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());
}
}