Android ImageView Animation

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

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

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

Поэтому, если я начну с этого …

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

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

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

Solutions Collecting From Web of "Android ImageView Animation"

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

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

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

Вы также можете просто использовать функцию «Поворот анимации». Для 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: ответ Кристофера дает информацию о том, как сделать его правильно, поэтому, удалив мое плохое предложение об отдельных потоках!

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

Больше здесь

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

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

 android:repeatCount="infinite" 

Я выяснил, что если вы используете .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); 

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

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

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