tipos tag studio sintaxis example codigo android animation android-activity android-design-library androiddesignsupport

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()); } }