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!

Foi útil?

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);

aqui

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top