Android ImageView Animação
-
19-09-2019 - |
Pergunta
Eu criei um layout com uma visualização de imagem e uma vista web. A visão web está definido para ter uma visibilidade padrão de fora. Quando os fogos de atividade acima mostra a vista de imagem em primeiro lugar e quando a vista web tem carregamento terminado a sua URL, ele próprio marcas como visível eo ImageView é marcado como oculto.
Quando o ImageView é mostrado, eu gostaria que ele gire várias vezes apenas para um pouco acrescentou pizazz.
Eu nunca fiz animações antes em Android e todas as mensagens que eu encontrei quando eu perguntei a internet não foram úteis; Assim, eu voltei a SO para obter ajuda.
Então, se eu começar com isso ...
final ImageView splash = (ImageView)findViewById(R.id.splash);
Como faço para criar uma animação de rotação repetida e aplicá-lo para o ImageView?
Mais uma vez obrigado!
Solução
Use a RotateAnimation
, definindo o ponto de pivô para o centro da sua imagem.
RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(700);
// Start animating the image
final ImageView splash = (ImageView) findViewById(R.id.splash);
splash.startAnimation(anim);
// Later.. stop the animation
splash.setAnimation(null);
Outras dicas
Como girar uma imagem em torno de seu centro:
ImageView view = ... //Initialize ImageView via FindViewById or programatically
RotateAnimation anim = new RotateAnimation(0.0f, 360.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//Setup anim with desired properties
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE); //Repeat animation indefinitely
anim.setDuration(700); //Put desired duration per anim cycle here, in milliseconds
//Start animation
view.startAnimation(anim);
//Later on, use view.setAnimation(null) to stop it.
Isto fará com que a imagem para rodar em torno do seu centro (0,5 ou 50% da sua largura / altura). Estou postando isso para futuros leitores que chegar aqui a partir do Google, como eu tenho, e que desejam rodar a imagem em torno de seu centro sem definir disse o centro em pixels absolutos.
Você também pode simplesmente usar o recurso de animação Girar. Que executa uma animação específica, para um montante pré-determinado de tempo, em um ImageView.
Animation rotate = AnimationUtils.loadAnimation([context], R.anim.rotate_picture);
splash.startAnimation(rotate);
Em seguida, crie um arquivo XML de animação em seus res / anim chamado rotate_picture com o conteúdo:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:duration="5000"
android:pivotX="50%"
android:pivotY="50%">
</rotate>
</set>
Agora, infelizmente, isso só irá executá-lo uma vez. Você precisará de um lugar loop para torná-lo repetir a animação enquanto ele está esperando. Eu experimentei um pouco e tenho o meu programa preso em loops infinitos, então eu não tenho certeza do melhor caminho para isso. EDIT: A resposta de Christopher fornece as informações sobre como fazê-lo laço corretamente, para remover o meu mau sugestão sobre segmentos separados
Uma maneira - dividir você imagem em N girando-o um pouco de cada vez. Eu diria que 5 é o suficiente. em seguida, criar algo como isto em drawable
<animation-list android:id="@+id/handimation" android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/progress1" android:duration="150" />
<item android:drawable="@drawable/progress2" android:duration="150" />
<item android:drawable="@drawable/progress3" android:duration="150" />
</animation-list>
início código
progress.setVisibility(View.VISIBLE);
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.setCallback(progress);
frameAnimation.setVisible(true, true);
batente código
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.stop();
frameAnimation.setCallback(null);
frameAnimation = null;
progress.setVisibility(View.GONE);
imgDics = (ImageView) v.findViewById(R.id.img_player_tab2_dics);
imgDics.setOnClickListener(onPlayer2Click);
anim = new RotateAnimation(0f, 360f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(4000);
// Start animating the image
imgDics.startAnimation(anim);
Dentro do elemento colocar:
android:repeatCount="infinite"
Eu descobri que, se você usar o .getWidth / 2 etc ... que não vai funcionar você precisa para obter o número de pixels da imagem é e dividir por 2 a si mesmo e, em seguida, basta digitar o número para os últimos 2 argumentos.
para dizer que sua imagem era um pixel de 120 por praça 120 pixel, ur x e y seria igual a 60 pixels. Assim, no seu código, você faria certo:
RotateAnimation anim = new RotateAnimation(0f, 350f, 60f, 60f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(700);
e agora sua imagem vai girar em torno de seu centro.
Código Verificado:
imageView.setImageResource(R.drawable.ic_arrow_up);
boolean up = true;
if (!up) {
up = true;
imageView.startAnimation(animate(up));
} else {
up = false;
imageView.startAnimation(animate(up));
}
private Animation animate(boolean up) {
Animation anim = AnimationUtils.loadAnimation(this, up ? R.anim.rotate_up : R.anim.rotate_down);
anim.setInterpolator(new LinearInterpolator()); // for smooth animation
return anim;
}
drawable / ic_arrow_up.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#3d3d3d"
android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
</vector>
anim / rotate_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fillEnabled="true">
<rotate
android:duration="200"
android:fromDegrees="-180"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="0" />
</set>
anim / rotate_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fillEnabled="true">
<rotate
android:duration="200"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180" />
</set>
do código não é difícil de imagem limites. utilização apenas:
RotateAnimation anim = new RotateAnimation( fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);