Tenho procurado em todos os lugares por uma solução adequada para o meu problema e não consigo encontrar uma ainda. Eu tenho uma ActionBar (ActionBarSherlock) com um menu que é inflado a partir de um arquivo XML e esse menu contém um item e esse item é mostrado como um ActionItem.
cardápio:
<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>
atividade:
[...]
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
[...]
O ActionItem é exibido com um ícone e sem texto, no entanto, quando um usuário clica no ActionItem, quero que o ícone comece a ser animado, mais especificamente, girando no lugar. O ícone em questão é um ícone de atualização.
Eu percebo que a ActionBar tem suporte para o uso de visualizações personalizadas ( adicionando uma visualização de ação ), no entanto, esta visualização personalizada é expandida para cobrir toda a área da ActionBar e realmente bloqueia tudo, exceto o ícone do aplicativo, que no meu caso não é o que eu estava procurando .
Então, minha próxima tentativa foi tentar usar o AnimationDrawable e definir minha animação quadro a quadro, definir o drawable como o ícone do item de menu e, em seguida, onOptionsItemSelected(MenuItem item)
obter o ícone e começar a animar usando ((AnimationDrawable)item.getIcon()).start()
. No entanto, isso não foi bem-sucedido. Alguém conhece alguma maneira de conseguir esse efeito?
android:paddingLeft="12dp"
eandroid:paddingRight="12dp"
ao meu próprio tema.Eu trabalhei um pouco na solução usando ActionBarSherlock, eu vim com isso:
res / layout / indeterminate_progress_action.xml
res / layout-v11 / indeterminate_progress_action.xml
res / drawable / rotation_refresh.xml
Código em atividade (eu o tenho na classe pai ActivityWithRefresh)
na atividade de criação de itens de menu
E o ícone, este é
drawable-xhdpi/ic_menu_navigation_refresh.png
Isso pode ser encontrado em http://developer.android.com/design/downloads/index.html#action-bar-icon-pack
fonte
Além do que Jake Wharton disse, provavelmente você deve fazer o seguinte para garantir que a animação pare suavemente e não salte assim que o carregamento terminar.
Primeiro, crie um novo booleano (para toda a classe):
Encontre o método que inicia seu carregamento. Defina seu booleano como verdadeiro quando a atividade começar a carregar.
Encontre o método que é iniciado quando o carregamento é concluído. Em vez de limpar a animação, defina seu booleano como falso.
Defina um AnimationListener em sua animação:
Então, cada vez que a animação for executada uma vez, ou seja, quando seu ícone fizer uma rotação, verifique o estado de carregamento e, se não estiver mais carregando, a animação irá parar.
Desta forma, a animação só pode ser interrompida se já estiver girada até o final e será repetida em breve E não estiver mais carregando.
Isso é pelo menos o que eu fiz quando quis implementar a ideia de Jake.
fonte
Também existe a opção de criar a rotação no código. Recorte completo:
fonte
Com a biblioteca de suporte, podemos animar o ícone sem o ActionView personalizado.
Não podemos animar drawable diretamente, então use DrawableWrapper (de android.support.v7 para API <21):
Tirei a ideia do DrawableWrapper daqui: https://stackoverflow.com/a/39108111/5541688
fonte
é minha solução muito simples (por exemplo, preciso de algum refatoramento) funciona com MenuItem padrão, você pode usá-lo com qualquer número de estados, ícones, animações, lógica, etc.
na aula de atividades:
ouvinte padrão:
em refreshData () faça algo assim:
método para definir a cor ou animação do ícone:
há 2 layouts com ícone (R.layout.refresh_action_view (+ "_actual")):
animação de rotação padrão neste caso (R.anim.rotation):
fonte
a melhor maneira é aqui:
e depois:
Lembre-se de que você não pode acessar "btsync = this.findViewById (R.id.action_sync);" em onCreate () ou onStart () ou onResume () ou onPostResume () ou onPostCreate () ou onCreateOptionsMenu () ou onPrepareOptionsMenu () se você quiser obtê-lo logo após o início da atividade, coloque-o em um pós-atraso:
fonte