Главное в потоках состоит в том, что они должны позволять вам выполнять параллельные задачи, но проблема в том, что они не гарантируют, «насколько параллельными» будут эти задачи на самом деле, когда они выполняются. Так как планировщик решает, какой поток выполнять в любой момент времени, вам не гарантируется, что ваши изображения будут постепенно исчезать / исчезать. Хотя вы можете выполнить эту задачу с помощью многопоточного кода, я не думаю, что это хороший кандидат.
Лучше всего обновить оба изображения (постепенно увеличивать / уменьшать) в каждом кадре анимации. A
сигнализирует, когда он начинает исчезать, и B
принимает этот сигнал, затем он начинает исчезать. Вы получите плавный переход, так как A
и B
будут обновляться в каждом кадре, и вы будете не имеют никакой неопределенности потоков. Сделайте то же самое для B
и C
.
ОБНОВЛЕНИЕ: Вы поймали меня! :)
Я думал, что вы позволите мне просто дать вам общую информацию, но теперь, когда вы меня загнали в угол, у меня не было выбора, кроме как погуглить материал :). Итак, в библиотеке android есть классы анимации , библиотека также предлагает вам способ выполнения покадровой анимации .
Я бы дал вам простой взлом за это, но я уверен, что есть лучшие способы сделать это:
Анимации состоят из нескольких изображений, которые должны отображаться в течение определенного времени, поэтому все, что вам нужно сделать, это чередовать изображения.
<!-- Animation frames are AfadeOut01.png to AfadeOut03.png and BfadeIn01.png to BfadeIn03.png files inside the res/drawable/ folder, -->
<animation-list android:id="selected" android:oneshot="true">
<item android:drawable="@drawable/AfadeOut01" android:duration="50" />
<item android:drawable="@drawable/BfadeIn01" android:duration="50" />
<item android:drawable="@drawable/AfadeOut02" android:duration="50" />
<item android:drawable="@drawable/BfadeIn02" android:duration="50" />
<item android:drawable="@drawable/AfadeOut03" android:duration="50" />
<item android:drawable="@drawable/BfadeIn03" android:duration="50" />
</animation-list>
Вы должны загрузить анимацию xml и отобразить анимацию, сделайте что-то вроде этого:
// Load the ImageView that will host the animation and
// set its background to our AnimationDrawable XML resource.
ImageView img = (ImageView)findViewById(/*resourceImageID e.g. AfadeOut03*/);
img.setBackgroundResource(/*backgroundResource*/);
// note that this loads the resource from an XML file, but
// instead of getting the resource from file you can generate
// it from a single image by performing the required modifications
// of the image and storing them in a resource.
// Get the background, which has been compiled to an AnimationDrawable object.
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
// Start the animation
frameAnimation.setOneShot(true);// don't loop if not set in XML
frameAnimation.start();
ОК, так что я знаю, что это был грязный хак, но он должен делать то, что вы хотите :). Если это слишком просто и плохо для вас, тогда вы можете пойти по оригинальному пути и попытаться выяснить, как отображать ваши изображения кадр за кадром и т. Д.