Как я могу изменить продолжительность анимации для Android AnimationDrawable "на лету"?
Я новичок в платформе ANDROID. Я использую следующее для анимации набора 16-дюймовых кадров с использованием AminationDrawable в моем приложении:
В XML файле у меня есть:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/image_1" android:duration="200" />
<item android:drawable="@drawable/image_1_25" android:duration="200" />
<item android:drawable="@drawable/image_1_5" android:duration="200" />
<item android:drawable="@drawable/image_1_75" android:duration="200" />
<item android:drawable="@drawable/image_2" android:duration="200" />
<item android:drawable="@drawable/image_2_25" android:duration="200" />
<item android:drawable="@drawable/image_2_5" android:duration="200" />
<item android:drawable="@drawable/image_2_75" android:duration="200" />
<item android:drawable="@drawable/image_3" android:duration="200" />
<item android:drawable="@drawable/image_3_25" android:duration="200" />
<item android:drawable="@drawable/image_3_5" android:duration="200" />
<item android:drawable="@drawable/image_3_75" android:duration="200" />
<item android:drawable="@drawable/image_4" android:duration="200" />
<item android:drawable="@drawable/image_4_25" android:duration="200" />
<item android:drawable="@drawable/image_4_5" android:duration="200" />
<item android:drawable="@drawable/image_4_75" android:duration="200" />
</animation-list>
В коде Java у меня есть следующий
Сначала я объявляю класс и добавляю метод onCreate(), где я настраивал анимацию.
public class MyNewActivity extends Activity
{
// member variables (accessible from within class methods below).
AnimationDrawable mainAnimation;
long mSpeed = 50;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.my_widget);
// set up image
ImageView mainImage = (ImageView) findViewById(R.id.image_widget);
mainImage.setBackgroundResource(R.drawable.animated_image);
mainAnimation = (AnimationDrawable) mainImage.getBackground();
};
<...snip...>
... затем позже я начинаю рисовать, когда пользователь нажимает кнопку Я вызываю следующее, чтобы начать перемещение анимации:
private void start()
{
// start the image rotating.
if (mainAnimation.isRunning())
mainAnimation.stop();
int numFrames = mainAnimation.getNumberOfFrames();
for (int ii = 0; ii < numFrames; ii++ )
{
// change the animation speed.
Drawable d = mainAnimation.getFrame(ii);
mainAnimation.scheduleDrawable(d, mainAnimation, mSpeed);
}
}
<... надрез... >
Поэтому в другом месте кода у меня есть место для настройки переменной-члена "mSpeed". Если я это сделаю, а затем вызову "start()", анимация начнется, однако скорость всегда будет одинаковой (по существу, что было определено в XML выше). Мой вопрос в том, как изменить "продолжительность" кадров чтобы переместить эту анимацию быстрее/медленнее на основе пользовательского ввода? Я не вижу способа изменить состояние "продолжительности" и, исходя из предположения, что вызов "ScheduleDrawable()" выше изменит продолжительность кадров чертежа.
Спасибо за помощь
Марк.
Ответы
Ответ 1
У меня была такая же проблема, но мне удалось ее решить, прочитав исходный код AnimationDrawable, реализовав мой собственный класс AnimationDrawable, который расширяет AnimationDrawable и переопределить метод Run()
и добавить метод setDuration()
, который позволяет мне установить продолжительность следующим образом:
Просматривая оригинальный метод запуска, мы видим, что он делает то же самое, но вызывая scheduleSelf(this, SystemClock.uptimeMillis() + duration);
с указанием времени, которое вы указали при добавлении фрейма, чтобы я его изменил. Я также добавляю продолжительность, потому что я использую то же самое для всех своих фреймов, но вы можете использовать массив новой продолжительности.
import android.graphics.drawable.AnimationDrawable;
import android.os.SystemClock;
public class MyAnimationDrawable extends AnimationDrawable {
private volatile int duration;//its volatile because another thread will update its value
private int currentFrame;
public MyAnimationDrawable() {
currentFrame = 0;
}
@Override
public void run() {
int n = getNumberOfFrames();
currentFrame++;
if (currentFrame >= n) {
currentFrame = 0;
}
selectDrawable(currentFrame);
scheduleSelf(this, SystemClock.uptimeMillis() + duration);
}
public void setDuration(int duration) {
this.duration = duration;
//we have to do the following or the next frame will be displayed after the old duration
unscheduleSelf(this);
selectDrawable(currentFrame);
scheduleSelf(this, SystemClock.uptimeMillis()+duration);
}
}
Это мой первый ответ, поэтому я надеюсь, что это поможет вам, и это объяснило хорошо.