Android girar imageview, no puedo establecer la posición final de imageview en onAnimationEnd ()

Quiero girar una imagen desde 30 grados en cada clic en un botón.

En el primer clic, puedo configurar la animación correctamente pero no puedo tener éxito para actualizar la posición de la vista de la imagen después de la animación. Cuando hice clic otra vez en el botón, la animación comienza desde la posición original de la vista de la imagen y no desde la posición final después de la primera animación.

Aquí está mi código:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); turnImg = (ImageView) findViewById(R.id.imageViewturnImg ); Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.imgTurn); // Getting width & height of the given image. int w = bmp.getWidth(); int h = bmp.getHeight(); turnImg .setImageBitmap(bmp); Button buttonok = (Button) findViewById(R.id.buttonok); buttonok.setOnClickListener(new OnClickListener() { public void onClick(View v) { turn(); } }); } public void turn() { float degrees = 30; RotateAnimation anim = new RotateAnimation(0, degrees,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f); anim.setInterpolator(new LinearInterpolator()); anim.setDuration(300); anim.setFillEnabled(true); anim.setFillAfter(true); anim.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { Matrix mat = turnImg.getImageMatrix(); mat.postRotate(30,turnImg.getWidth()/2, turnImg.getHeight()/2); turnImg.setScaleType(ScaleType.MATRIX); turnImg.setImageMatrix(mat); } @Override public void onAnimationRepeat(Animation animation) {} @Override public void onAnimationStart(Animation animation) {} }); turnImg.startAnimation(anim); } 

Creo que el problema vino de la forma en que actualizar la posición en el onAnimationEnd ().

Ps: lo siento por mi mal inglés …

One Solution collect form web for “Android girar imageview, no puedo establecer la posición final de imageview en onAnimationEnd ()”

El problema es que su animación no está afectando al mismo objeto que su rotación de matriz. Es decir, está animando la rotación del objeto ImageView, pero luego está estableciendo la rotación de la imagen que se encuentra dentro de ese objeto ImageView. Así, por ejemplo, la primera vez que lo gira, ImageView gira de 0 a 30 grados, y luego permanece a una rotación de 30 grados debido a la llamada a setFillAfter (true). A continuación, se ejecuta el controlador onAnimationEnd (), que gira la imagen interna en 30 grados. Esto efectivamente salta la imagen a una rotación de 60 grados, según lo visto por el usuario (30 para la vista, 30 para el mapa de bits). Entonces la próxima vez que se ejecuta la animación, gira la vista de 0 a 30 grados, con la imagen interna todavía en su rotación de 30 grados. Esto hace que parezca al usuario como si estuviera girando de 30 a 60 grados. A continuación, se aplica otra rotación en la imagen interna cuando la animación termina, terminando con la imagen girada a 60 grados y la vista girada (de nuevo) a 30 grados, por lo que la imagen ahora se gira visualmente a 90 grados.

Y así.

Hay diferentes maneras de manejar este problema, pero una manera sencilla es evitar que afecte a los dos objetos diferentes – sólo funciona con ImageView. En lugar de girar de 0 a 30 cada vez, gire de lo que sea la rotación actual a ese valor más 30 grados. Puede quitar el controlador onAnimationEnd (), ya que ya no tendrá que girar la imagen dentro de la vista.

El código resultante para turn () es mucho más simple:

 public void turn() { RotateAnimation anim = new RotateAnimation(currentRotation, currentRotation + 30, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f); currentRotation = (currentRotation + 30) % 360; anim.setInterpolator(new LinearInterpolator()); anim.setDuration(1000); anim.setFillEnabled(true); anim.setFillAfter(true); turnImg.startAnimation(anim); } 

Este código asume una variable de instancia de currentRotation, que se utiliza para rastrear los últimos grados a los que se giró la vista. Su un poco más involucrado si usted permite que el usuario haga clic en la mitad de la animación, pero no demasiado difícil.

Por cierto, esto es mucho más simple en el sistema de animación en 3.0; Ahora hay una propiedad de "rotación" en View, y puede ejecutar una animación en esa propiedad y puede rastrear su propio valor actual. Pero el enfoque anterior debería funcionar para versiones anteriores.

  • Rotar la vista de anuncio con API 8
  • Cómo girar cuatro sprites al foco de estos sprites
  • Dibujar el texto verticalmente sobre lienzo
  • Perder datos al girar la pantalla
  • ¿Cómo puedo detectar la rotación de la pantalla?
  • Cómo girar un drawable con anti-aliasing habilitado
  • Box2D rotar un objeto, ¿cómo?
  • Android Rotación de MapView
  • Deshabilitar y habilitar cambios de orientación en una actividad en Android mediante programación
  • ¿Por qué querría alguna vez `setRetainInstance (false)`? - O - La forma correcta de manejar la rotación del dispositivo
  • Android Animated Vector Drawable: cambia el grado de rotación en tiempo de ejecución
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.