Подтвердить что ты не робот

Android ImageView Animation

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Используйте 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);

Ответ 2

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

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, как и у меня, и которые хотят повернуть изображение вокруг своего центра, не определяя упомянутый центр в абсолютных пикселях.

Ответ 3

Вы также можете просто использовать функцию поворота анимации. Это запускает определенную анимацию в течение заранее определенного промежутка времени в 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>

Теперь, к сожалению, это будет работать только один раз. Вам понадобится петля где-нибудь, чтобы повторить анимацию, пока она ждет. Я немного экспериментировал и запустил свою программу в бесконечных циклах, поэтому я не уверен в этом. EDIT: ответ Кристофера предоставляет информацию о том, как сделать его правильным, поэтому удалив мое плохое предложение об отдельных потоках!

Ответ 4

Один из способов - разбить изображение на 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);

подробнее здесь

Ответ 5

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

Ответ 6

Внутри элемента put:

android:repeatCount="infinite"

Ответ 7

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

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

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

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

Ответ 8

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

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