Android - Как переключать виды с 3-мя изображениями? - PullRequest
3 голосов
/ 26 февраля 2010

Мне нужна помощь, чтобы придумать способ выполнения следующей последовательности с использованием некоторого типа вида или комбинации макетов в Android:

У меня есть 3 объекта изображения ... скажем, объекты A, B и C ...

[все объекты невидимы и наслоены, один поверх другого ... A / B / C, как в RelativeLayout] -> [исчезать в объекте A] -> [отображать A в течение 200 мс] - > [одновременно исчезают объект A и исчезают в объекте B] -> [отображают объект B на 200 мс] -> [одновременно исчезают объект B и исчезают в объекте C] -> [объект C остается на экране бесконечно долго]

Я перепробовал каждую комбинацию Threads, AsyncTasks, Handlers, пользовательских макетов, AnimationListeners и т. Д., Но все, что я пробовал, не удалось.

Если бы только ViewSwitcher мог занимать более 2 просмотров ... Пожалуйста, помогите.

Ryan

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

Главное в потоках состоит в том, что они должны позволять вам выполнять параллельные задачи, но проблема в том, что они не гарантируют, «насколько параллельными» будут эти задачи на самом деле, когда они выполняются. Так как планировщик решает, какой поток выполнять в любой момент времени, вам не гарантируется, что ваши изображения будут постепенно исчезать / исчезать. Хотя вы можете выполнить эту задачу с помощью многопоточного кода, я не думаю, что это хороший кандидат.

Лучше всего обновить оба изображения (постепенно увеличивать / уменьшать) в каждом кадре анимации. 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();

ОК, так что я знаю, что это был грязный хак, но он должен делать то, что вы хотите :). Если это слишком просто и плохо для вас, тогда вы можете пойти по оригинальному пути и попытаться выяснить, как отображать ваши изображения кадр за кадром и т. Д.

0 голосов
/ 26 февраля 2010

Эти вещи на самом деле не требуют потоков, они требуют анимации. В частности, AlphaAnimation. Посетите страницу Alpha Animation , чтобы узнать, как ее использовать. Это довольно просто, вы просто устанавливаете, что вы хотите, чтобы происходило и как долго вы хотите, чтобы это заняло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...