Android ImageView Анимация - PullRequest
       15

Android ImageView Анимация

60 голосов
/ 09 января 2010

Я создал макет с изображением и веб-представлением. В веб-представлении по умолчанию отображается видимость исчезнувшего. Когда действие запускается, сначала отображается представление изображения, а когда веб-представление завершило загрузку своего URL-адреса, оно помечается как видимое, а представление изображения помечается как скрытое.

Когда показывается изображение, я бы хотел, чтобы оно несколько раз вращалось, только для небольшого добавления Pizazz.

Я никогда раньше не делал анимации в Android, и все посты, которые я нашел, когда я спросил Интернет, не были полезны; таким образом, я вернулся к SO за помощью.

Так что, если я начну с этого ...

    final ImageView splash = (ImageView)findViewById(R.id.splash);

Как создать анимацию повторного поворота и применить ее к ImageView?

Еще раз спасибо!

Ответы [ 9 ]

102 голосов
/ 09 января 2010

Используйте RotateAnimation, устанавливая точку вращения в центре вашего изображения.

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);
49 голосов
/ 17 августа 2012

Как повернуть изображение вокруг его центра:

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.

Это заставит изображение вращаться вокруг его центра (0,5 или 50% его ширины / высоты). Я публикую это для будущих читателей, которые получают от Google, как и я, и которые хотят повернуть изображение вокруг его центра, не определяя его в абсолютных пикселях.

24 голосов
/ 09 января 2010

Вы также можете просто использовать функцию поворота анимации.Он запускает определенную анимацию в течение предварительно определенного периода времени в ImageView.

Animation rotate = AnimationUtils.loadAnimation([context], R.anim.rotate_picture);
splash.startAnimation(rotate);

Затем создайте файл анимации XML в вашем res / anim с именем rotate_picture с содержимым:

<?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>

Теперь, к сожалению, он будет запущен только один раз.Вам понадобится где-нибудь цикл, чтобы заставить его повторять анимацию, пока он ждет.Я немного поэкспериментировал, и моя программа застряла в бесконечных циклах, так что я не уверен, что это лучший способ.РЕДАКТИРОВАТЬ: Ответ Кристофера предоставляет информацию о том, как сделать это правильно, так что убрал мое плохое предложение о отдельных темах!

11 голосов
/ 09 января 2010

Один из способов - разделить изображение на N, слегка поворачивая его каждый раз. Я бы сказал, 5 достаточно. затем создайте что-то вроде этого в 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> 

код начала

progress.setVisibility(View.VISIBLE);
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.setCallback(progress);
frameAnimation.setVisible(true, true);

код остановки

AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.stop();
frameAnimation.setCallback(null);
frameAnimation = null;
progress.setVisibility(View.GONE);

больше здесь

7 голосов
/ 19 сентября 2013
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);
5 голосов
/ 09 апреля 2011

Внутри элемента положено:

android:repeatCount="infinite"
3 голосов
/ 07 апреля 2012

Я обнаружил, что если вы используете .getWidth / 2 и т. Д., Что он не будет работать, вам нужно получить количество пикселей изображения и разделить его на 2, а затем просто ввести число для последних 2 аргументов.

скажем, ваше изображение было квадратом 120 на 120 пикселей, ur x и y будут равны 60 пикселям. так что в своем коде вы бы правильно:

RotateAnimation anim = new RotateAnimation(0f, 350f, 60f, 60f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(700);

и теперь ваше изображение будет вращаться вокруг его центра.

2 голосов
/ 12 марта 2018

Проверенный код:

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

вытяжка / 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>

аним / 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>

аним / 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>
0 голосов
/ 11 марта 2015

Не кодируйте жесткие границы изображения.Просто используйте:

RotateAnimation anim = new RotateAnimation( fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
...