Estou usando um RotateAnimation
para girar uma imagem que estou usando como um girador cíclico personalizado no Android. Aqui está o meu rotate_indefinitely.xml
arquivo, que eu coloquei res/anim/
:
<?xml version="1.0" encoding="UTF-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:duration="1200" />
Quando aplico isso ao meu ImageView
uso AndroidUtils.loadAnimation()
, ele funciona muito bem!
spinner.startAnimation(
AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely) );
O único problema é que a rotação da imagem parece pausar na parte superior de cada ciclo.
Em outras palavras, a imagem gira 360 graus, pausa brevemente e depois gira 360 graus novamente, etc.
Eu suspeito que o problema é que a animação está usando um interpolador padrão como android:iterpolator="@android:anim/accelerate_interpolator"
( AccelerateInterpolator
), mas não sei como dizer para não interpolar a animação.
Como posso desativar a interpolação (se esse é realmente o problema) para fazer minha animação funcionar sem problemas?
Eu também tive esse problema e tentei definir o interpolador linear em xml sem sucesso. A solução que funcionou para mim foi criar a animação como uma RotateAnimation no código.
fonte
rotate.setFillAfter(true);
rotate.setRepeatCount(Animation.INFINITE);
Isso funciona bem
Para inverter a rotação:
fonte
Talvez algo como isto ajude:
A propósito, você pode girar mais de 360 como:
fonte
Tente usar,
toDegrees="359"
pois 360 ° e 0 ° são iguais.fonte
Tente isso.
fonte
Objeto de rotação programaticamente.
// rotação no sentido horário :
// Rotação anti-horária:
view é objeto do seu ImageView ou de outros widgets.
rotate.setRepeatCount (10); use para repetir sua rotação.
500 é a duração do seu tempo de animação.
fonte
A
<set>
remoção do -Element que envolveu o<rotate>
-Element resolve o problema!Graças a Shalafi!
Portanto, seu Rotation_ccw.xml deve ficar assim:
fonte
Não importa o que eu tentei, não consegui fazer isso funcionar corretamente usando o código (e o setRotation) para uma animação de rotação suave. O que acabei fazendo foi fazer as mudanças de grau serem tão pequenas que as pequenas pausas são imperceptíveis. Se você não precisar fazer muitas rotações, o tempo para executar esse loop é insignificante. O efeito é uma rotação suave:
fonte
Como Hanry mencionou acima, colocar o iterpolator do liner é bom. Mas se a rotação estiver dentro de um conjunto, você deve colocar android: shareInterpolator = "false" para torná-lo suave.
Se o Sharedinterpolator não for falso, o código acima indica falhas.
fonte
Se você estiver usando um conjunto de animação como eu, adicione a interpolação dentro da tag set:
Isso funcionou para mim.
fonte
Em Kotlin:
fonte
É possível que, como você passe de 0 a 360, gaste um pouco mais de tempo em 0/360 do que esperava? Talvez definido como Graus para 359 ou 358.
fonte
Tente usar mais de 360 para evitar a reinicialização.
Eu uso 3600 insted de 360 e isso funciona bem para mim:
fonte
No Android, se você deseja animar um objeto e fazê-lo mover um objeto de location1 para location2, a API de animação descobre os locais intermediários (interpolação) e enfileira no thread principal as operações de movimentação apropriadas nos horários apropriados, usando um timer . Isso funciona bem, exceto que o encadeamento principal geralmente é usado para muitas outras coisas - pintura, abertura de arquivos, resposta às entradas do usuário etc. Um timer em fila geralmente pode ser atrasado. Programas bem escritos sempre tentarão realizar o maior número possível de operações em threads em segundo plano (não principais), mas nem sempre é possível evitar o uso da thread principal. As operações que exigem que você opere em um objeto de interface do usuário sempre precisam ser realizadas no encadeamento principal. Além disso, muitas APIs direcionarão as operações de volta para o thread principal como uma forma de segurança de thread.
As visualizações são todas desenhadas no mesmo encadeamento da GUI, que também é usado para toda a interação do usuário.
Portanto, se você precisar atualizar a GUI rapidamente ou se a renderização demorar muito e afetar a experiência do usuário, use o SurfaceView.
Exemplo de imagem de rotação:
atividade:
fonte
fonte