No iOS, existe um recurso muito fácil e poderoso para animar a adição e remoção de linhas do UITableView. Aqui está um clipe de um vídeo do youtube mostrando a animação padrão. Observe como as linhas circundantes são recolhidas na linha excluída. Essa animação ajuda os usuários a acompanhar o que mudou em uma lista e onde eles estavam olhando quando os dados foram alterados.
Desde que desenvolvi no Android, não encontrei um recurso equivalente para animar linhas individuais em um TableView . A ligação notifyDataSetChanged()
ao meu adaptador faz com que o ListView atualize imediatamente seu conteúdo com novas informações. Gostaria de mostrar uma animação simples de uma nova linha entrando ou saindo quando os dados mudam, mas não consigo encontrar nenhuma maneira documentada de fazer isso. Parece que o LayoutAnimationController pode ter uma chave para fazer com que isso funcione, mas quando defino um LayoutAnimationController no meu ListView (semelhante ao LayoutAnimation2 do ApiDemo ) e removo elementos do meu adaptador depois que a lista é exibida, os elementos desaparecem imediatamente em vez de serem animados .
Também tentei coisas como as seguintes para animar um item individual quando ele é removido:
@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
Animation animation = new ScaleAnimation(1, 1, 1, 0);
animation.setDuration(100);
getListView().getChildAt(position).startAnimation(animation);
l.postDelayed(new Runnable() {
public void run() {
mStringList.remove(position);
mAdapter.notifyDataSetChanged();
}
}, 100);
}
No entanto, as linhas que cercam a linha animada não se movem até que pulem para suas novas posições quando notifyDataSetChanged()
são chamadas. Parece que o ListView não atualiza seu layout depois que seus elementos foram colocados.
Enquanto escrevia minha própria implementação / fork do ListView me passou pela cabeça, isso parece algo que não deve ser tão difícil.
Obrigado!
Respostas:
para animação de cima para baixo, use:
fonte
anim.setAnimationListener(new AnimationListener() { ... })
em vez de usar um HandlerpopulateList()
?Handler
. Segundo, torna o código menos complexo já usando um retorno de chamada interno para quando a animação terminar. Terceiro, você não sabe como a implementaçãoHandler
eAnimation
funcionará em cada plataforma; pode ser possível que a sua execução atrasada aconteça antes que a animação termine.Ele
RecyclerView
cuida de adicionar, remover e reordenar animações!Este projeto simples do AndroidStudio apresenta a
RecyclerView
. dê uma olhada nos commits :fonte
Dê uma olhada na solução do Google. Aqui está apenas um método de exclusão.
Código do projeto ListViewRemovalAnimation e demonstração em vídeo
Ele precisa do Android 4.1 ou superior (API 16). Mas temos 2014 lá fora.
fonte
Como
ListViews
são altamente otimizados, acho que isso não é possível de ser feito. Você tentou criar seu "ListView" por código (ou seja, inflando suas linhas de xml e anexando-as aLinearLayout
) e animando-as?fonte
LinearLayout
, no entanto, com umLinearLayout
desempenho muito grande de conjuntos de dados , isso se tornará péssimo.ListView
possui muitas otimizações inteligentes em torno da reciclagem de visualizações que permitem lidar com grandes conjuntos de dados (o UITableView do iOS tem as mesmas otimizações). Escrever meu próprio reciclador de exibição se enquadra na categoria de reimplementar o ListView :(Você já pensou em animar uma varredura para a direita? Você pode fazer algo como desenhar uma barra branca progressivamente maior na parte superior do item da lista e removê-la da lista. As outras células ainda se encaixavam no lugar, mas seria melhor que nada.
fonte
chamar listView.scheduleLayoutAnimation (); antes de mudar a lista
fonte
Eu hackeei outra maneira de fazer isso sem ter que manipular a exibição de lista. Infelizmente, as animações regulares do Android parecem manipular o conteúdo da linha, mas são ineficazes ao reduzir a exibição. Portanto, primeiro considere este manipulador:
Adicione esta coleção ao seu adaptador de lista:
e adicione
Em seguida, onde quer que você queira ocultar uma linha, adicione isto:
É isso aí! Você pode alterar a velocidade da animação alterando o número de pixels que diminui a altura de uma só vez. Não é realmente sofisticado, mas funciona!
fonte
Depois de inserir uma nova linha no ListView, basta rolar o ListView para a nova posição.
fonte
Eu não tentei, mas parece que o animateLayoutChanges deve fazer o que você está procurando. Eu o vejo na classe ImageSwitcher, presumo que também esteja na classe ViewSwitcher?
fonte
Como o Android é de código aberto, você não precisa realmente reimplementar as otimizações do ListView. Você pode pegar o código do ListView e tentar encontrar uma maneira de invadir a animação, também pode abrir uma solicitação de recurso no rastreador de erros do Android (e se você decidiu implementá-lo, não se esqueça de contribuir com um patch ).
Para sua informação, o código fonte do ListView está aqui .
fonte
Aqui está o código fonte para permitir excluir linhas e reordená-las.
Um arquivo APK de demonstração também está disponível. A exclusão de linhas é feita mais ao longo das linhas do aplicativo Gmail do Google, que revela uma vista inferior depois de deslizar uma vista superior. A vista inferior pode ter um botão Desfazer ou o que você quiser.
fonte
Sempre que a idéia é criar bitmaps por getdrawingcache. Tenha dois bitmap e anime o bitmap inferior para criar o efeito de movimento
Por favor, veja o seguinte código:
Para entender as imagens, consulte este
Obrigado.
fonte
Eu fiz algo semelhante a isso. Uma abordagem é interpolar, durante o tempo da animação, a altura da exibição ao longo do tempo nas linhas
onMeasure
durante a emissãorequestLayout()
do listView. Sim, pode ser melhor fazer diretamente dentro do código listView, mas foi uma solução rápida (que parecia boa!)fonte
Apenas compartilhando outra abordagem:
Primeiro, defina o android da exibição de lista : animateLayoutChanges como true :
Então eu uso um manipulador para adicionar itens e atualizar a lista com atraso:
fonte