Android-анимация ImageView
-
19-09-2019 - |
Вопрос
Я создал макет с изображением и веб-просмотром.Для веб-представления настроена видимость по умолчанию «Прошло».Когда действие запускается, оно сначала отображает представление изображения, а когда веб-представление завершает загрузку своего URL-адреса, оно помечает себя как видимое, а представление изображения помечается как скрытое.
Когда отображается изображение, я бы хотел, чтобы оно несколько раз вращалось, просто для небольшого добавленного изящества.
Я никогда раньше не создавал анимацию для Android, и все сообщения, которые я нашел, когда спрашивал в Интернете, не были полезными;таким образом, я вернулся в SO за помощью.
Итак, если я начну с этого...
final ImageView splash = (ImageView)findViewById(R.id.splash);
Как создать повторяющуюся анимацию поворота и применить ее к ImageView?
Еще раз спасибо!
Решение
Использовать 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>
К сожалению, это запустится только один раз.Вам понадобится где-то цикл, чтобы он повторял анимацию во время ожидания.Я немного поэкспериментировал, и моя программа застряла в бесконечных циклах, поэтому я не уверен, как лучше всего это сделать.РЕДАКТИРОВАТЬ:Ответ Кристофера содержит информацию о том, как правильно его зациклить, поэтому удаляю мое плохое предложение об отдельных потоках!
Один из способов - разделить изображение на 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, а затем просто ввести число для последних двух аргументов.
скажем, ваше изображение представляет собой квадрат размером 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);
и теперь ваше изображение будет вращаться вокруг своего центра.
Проверенный код:
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>
Не жестко кодируйте границы изображения.Просто используйте:
RotateAnimation anim = new RotateAnimation( fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);