He estado buscando en todas partes una solución adecuada a mi problema y parece que todavía no puedo encontrar una. Tengo una ActionBar (ActionBarSherlock) con un menú que se infla desde un archivo XML y ese menú contiene un elemento y ese elemento se muestra como ActionItem.
menú:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_refresh"
android:icon="@drawable/ic_menu_refresh"
android:showAsAction="ifRoom"
android:title="Refresh"/>
</menu>
actividad:
[...]
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
[...]
ActionItem se muestra con un icono y sin texto; sin embargo, cuando un usuario hace clic en ActionItem, quiero que el icono comience a animarse, más específicamente, a rotar en su lugar. El icono en cuestión es un icono de actualización.
Me doy cuenta de que ActionBar tiene soporte para usar vistas personalizadas ( Agregar una vista de acción ); sin embargo, esta vista personalizada se expande para cubrir toda el área de ActionBar y en realidad bloquea todo excepto el ícono de la aplicación, que en mi caso no es lo que estaba buscando. .
Así que mi siguiente intento fue intentar usar AnimationDrawable y definir mi animación cuadro por cuadro, establecer el elemento de dibujo como el ícono del elemento del menú, y luego onOptionsItemSelected(MenuItem item)
obtener el ícono y comenzar a animar usando ((AnimationDrawable)item.getIcon()).start()
. Sin embargo, esto no tuvo éxito. ¿Alguien conoce alguna forma de lograr este efecto?
android:paddingLeft="12dp"
yandroid:paddingRight="12dp"
a mi propio tema.Trabajé un poco en la solución usando ActionBarSherlock, se me ocurrió esto:
res / layout / indeterminate_progress_action.xml
res / layout-v11 / indeterminate_progress_action.xml
res / drawable / rotacion_refresh.xml
Código en actividad (lo tengo en la clase principal ActivityWithRefresh)
en actividad creando elementos de menú
Y el icono, este es
drawable-xhdpi/ic_menu_navigation_refresh.png
Esto se puede encontrar en http://developer.android.com/design/downloads/index.html#action-bar-icon-pack
fuente
Además de lo que dijo Jake Wharton, probablemente debería hacer lo siguiente para asegurarse de que la animación se detenga sin problemas y no salte tan pronto como finalice la carga.
Primero, cree un nuevo booleano (para toda la clase):
Encuentra el método que inicia tu carga. Establezca su booleano en verdadero cuando la actividad comience a cargarse.
Busque el método que se inicia cuando finaliza la carga. En lugar de borrar la animación, establezca su booleano en falso.
Establezca un AnimationListener en su animación:
Luego, cada vez que se ejecutó la animación una vez, eso significa que cuando su ícono hizo una rotación, verifique el estado de carga y, si no se carga más, la animación se detendrá.
De esta manera, la animación solo se puede detener si ya giró hasta el final y se repetirá en breve Y ya no se está cargando.
Esto es al menos lo que hice cuando quise implementar la idea de Jake.
fuente
También hay una opción para crear la rotación en código. Recorte completo:
fuente
Con la biblioteca de soporte podemos animar el icono sin actionView personalizado.
No podemos animar dibujable directamente, así que use DrawableWrapper (de android.support.v7 para API <21):
Tomé la idea de DrawableWrapper desde aquí: https://stackoverflow.com/a/39108111/5541688
fuente
Es mi solución muy simple (por ejemplo, necesito una refactorización) funciona con MenuItem estándar, puede usarlo con cualquier número de estados, íconos, animaciones, lógica, etc.
en clase de actividad:
oyente estándar:
en refreshData () haga algo como esto:
método para definir el color o la animación del icono:
hay 2 diseños con el icono (R.layout.refresh_action_view (+ "_actual")):
standart rotate animation en este caso (R.anim.rotation):
fuente
la mejor manera es aquí:
y entonces:
Recuerde que no puede acceder a "btsync = this.findViewById (R.id.action_sync);" en onCreate () o onStart () o onResume () o onPostResume () o onPostCreate () o onCreateOptionsMenu () o onPrepareOptionsMenu () si desea obtenerlo justo después de que comience la actividad, póngalo en un postratamiento:
fuente