Estoy consiguiendo resultados extraños con el siguiente código:

iv = (ImageView) findViewById(R.id.iv);
        iv.setImageResource(R.drawable.spinner_white_76);

        Animation a = new RotateAnimation(0.0f, 360.0f,
                Animation.RELATIVE_TO_SELF, iv.getDrawable()
                        .getIntrinsicWidth() / 2, Animation.RELATIVE_TO_SELF,
                iv.getDrawable().getIntrinsicHeight() / 2);
        a.setRepeatCount(-1);
        a.setDuration(1000);

        iv.startAnimation(a);

Cuál es la manera correcta para especificar el punto del eje (centro de la imagen)?

InformationsquelleAutor Sameer Segal | 2010-09-27

3 Comentarios

  1. 61

    Siento estúpido! Tengo que trabajar después de pasar algún tiempo cerca de la lectura de la documentación:

    Animation a = new RotateAnimation(0.0f, 360.0f,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                    0.5f);
            a.setRepeatCount(-1);
            a.setDuration(1000);
    • La adición de una».setInterpolator(nueva LinearInterpolator());» hace que la rotación un poco más suave.
    • Quiero un giro de 180 grados, pero no repetición. después de la rotación, el objeto estará en el estado final lo que quiero decir que no va a volver a la posición inicial. ¿Cómo puedo hacer eso?
    • Omar Faroque Anik : añadir «un.setFillAfter(true);» hacer de la transformación persistente y una».setRepeatCount(0);» para la no repetición.
    • Gracias Youuu!!! Este es un trabajo muy bien.thx
    • Guardado horas de mi trabajo. Muchas gracias. 🙂
  2. 6

    Tenga en cuenta que esto no funcionará si el objeto tiene asimétrica de relleno (por ejemplo a la izquierda padding de 5px y un margen derecho de la 0px), debido a que el relleno se considera parte del objeto. Lo que significa que la calculada centro serán compensados.

    Una solución a esto es el uso de márgenes en lugar de relleno si usted está usando acolchado para el diseño de razones. Como la API dice con respecto a los márgenes: «Este espacio es fuera de este punto de vista los límites.» (ViewGroup.MarginLayoutParams)

    Esto significa que los márgenes no va a girar como relleno no.

    • Cómo iba yo a decirle a la RotateAnimation considerar los Márgenes?
  3. 4

    Título de esta pregunta es Dibujable de Rotación alrededor de su centro (y yo estaba buscando exactamente para él, no había encontrado y había que aplicar yo mismo) le gustaría publicar mi solución/respuesta.

    Terminé de escribir personalizado dibujable que puede envolver cualquier dibujable y permitir su rotación. Aquí está el código:

    public class RotatableDrawable extends DrawableWrapper {
    private float rotation;
    private Rect bounds;
    private ObjectAnimator animator;
    private long defaultAnimationDuration;
    public RotatableDrawable(Resources resources, Drawable drawable) {
    super(vectorToBitmapDrawableIfNeeded(resources, drawable));
    bounds = new Rect();
    defaultAnimationDuration = resources.getInteger(android.R.integer.config_mediumAnimTime);
    }
    @Override
    public void draw(Canvas canvas) {
    copyBounds(bounds);
    canvas.save();
    canvas.rotate(rotation, bounds.centerX(), bounds.centerY());
    super.draw(canvas);
    canvas.restore();
    }
    public void rotate(float degrees) {
    rotate(degrees, defaultAnimationDuration);
    }
    public void rotate(float degrees, long millis) {
    if (null != animator && animator.isStarted()) {
    animator.end();
    } else if (null == animator) {
    animator = ObjectAnimator.ofFloat(this, "rotation", 0, 0);
    animator.setInterpolator(new AccelerateDecelerateInterpolator());
    }
    animator.setFloatValues(rotation, degrees);
    animator.setDuration(millis).start();
    }
    @AnimatorSetter
    public void setRotation(float degrees) {
    this.rotation = degrees % 360;
    invalidateSelf();
    }
    /**
    * Workaround for issues related to vector drawables rotation and scaling:
    * https://code.google.com/p/android/issues/detail?id=192413
    * https://code.google.com/p/android/issues/detail?id=208453
    */
    private static Drawable vectorToBitmapDrawableIfNeeded(Resources resources, Drawable drawable) {
    if (drawable instanceof VectorDrawable) {
    Bitmap b = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    drawable.setBounds(0, 0, c.getWidth(), c.getHeight());
    drawable.draw(c);
    drawable = new BitmapDrawable(resources, b);
    }
    return drawable;
    }
    }
    • ¿Qué es @AnimatorSetter?
    • Uy… Es solo mi costumbre de anotación. Yo lo uso para indicar a ProGuard y Android studio que este método es que realmente se usan para la animación. (ObjectAnimator.ofFloat(this, «rotación», 0, 0); invoca métodos setrotation durante la ejecución)
    • Esta clase debe tenerse en ProGuard y VectorDrawable causará crash en pre Lollipop, pero no es necesario a menos que utilizando el vector de dibujables.
    • puede utilizar la siguiente verificación para apoyar pre Lollipop (dibujable instanceof VectorDrawableCompat || dibujable.getClass().getSimpleName().equals(«VectorDrawable»)) insteado (dibujable instanceof VectorDrawable)

Dejar respuesta

Please enter your comment!
Please enter your name here