2010-02-25 5 views
2

je besoin d'aide pour venir avec une manière d'exécuter la séquence suivante en utilisant un certain type de vue ou d'une combinaison de mise en page dans Android:Android - Comment changer de vue avec 3 ImageViews?

J'ai 3 objets d'image ... dire l'objet A, B et C ...

[tous les objets invisibles et superposés, les uns au-dessus des autres ... A/B/C, comme dans un RelativeLayout] -> [fondu dans l'objet A] -> [affichent A pendant 200ms] - > [fondu simultanément l'objet A et fondu dans l'objet B] -> [objet d'affichage B pendant 200ms] -> [fondu sortant l'objet B et fondu dans l'objet C] -> [l'objet C reste indéfiniment sur l'écran]

J'ai essayé chaque combinaison de Threads, AsyncTasks, Handler s, des dispositions personnalisées, AnimationListeners, etc. mais tout ce que j'ai essayé a échoué.

Si seulement ViewSwitcher pouvait prendre plus de 2 vues ... S'il vous plaît, aidez-moi.

Ryan

Répondre

1

La principale chose à propos des fils est qu'ils sont censés vous permettre d'effectuer des tâches parallèles, mais le problème est qu'ils ne garantissent pas « comment parallèle » ces tâches regarderont réellement quand ils sont réalisé. Étant donné que le planificateur décide quel thread exécuter à un moment donné, vous n'êtes pas certain que vos images seront correctement entrantes/sortantes. Alors que vous pouvez faire cette tâche avec du code multithread, je ne pense pas que ce soit un bon candidat. La meilleure chose à faire est de mettre à jour les deux images (fondu avant/arrière) sur chaque image de l'animation. A signaux quand il commence à disparaître et B capte ce signal, puis il commence à fondre. Vous obtiendrez une transition en douceur puisque les deux A et B sont mis à jour sur chaque trame, et vous n'aurez aucune incertitude de la threads. Faites la même chose pour B et C.

MISE À JOUR: Vous m'a attrapé! :)
Je pensais que vous me laisseriez sortir avec juste vous donner les informations générales, mais maintenant que vous m'avez coincé je n'avais pas d'autre choix que de google trucs :). OK, de sorte que la bibliothèque Android a quelques animation classes, la bibliothèque vous offre également un moyen dans lequel vous pouvez réellement effectuer frame-by-frame animation. Je vous donnerais un hack simple pour cela, mais je suis sûr qu'il y a de meilleures façons de le faire: Les animations prennent plusieurs images qui devraient être affichées sur une certaine durée, tout ce que vous avez à faire est alterner les images.

<!-- 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> 

Vous devez charger l'animation XML et afficher l'animation, faire quelque chose comme ceci:

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

OK, donc je sais que c'était un sale hack, mais il faut faire ce que vous voulez:). Si cela est trop simple et non cool pour vous, alors vous pouvez suivre la route originale et essayer de comprendre comment afficher vos images image par image, etc.

+0

D'accord, cela a du sens. Je vous remercie.Donc, votre suggestion serait de créer une classe qui s'étend d'un View/ImageView/SurfaceView et exécuter l'animation alpha sur les trois bitmaps directement? Comment contrôler la vitesse ou la durée des animations globales? Si je le configure pour appeler à plusieurs reprises onDraw ou Invalidate, comment contrôler la fréquence? Encore une fois, merci pour la réponse. – RyanM

+0

@ borg17of20 Ah ... eh bien, maintenant vous m'avez attrapé en flagrant délit:) ... je ne suis pas vraiment familier avec les bibliothèques android pour l'animation, mais heureusement google est mon ami et j'ai pu trouver quelques liens: http : //code.google.com/android/reference/android/view/animation/package-descr.html et http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html Je vais mettre à jour ma réponse pour plus d'informations. – Kiril

+0

Votre lien vers AnimationDrawable m'a aidé à trouver ceci: http://code.davidjanes.com/blog/2009/11/23/animated-slideshow-on-android/ qui semble prometteur. – RyanM

0

Ces choses ne nécessitent pas vraiment de fil, elles nécessitent une animation . Plus spécifiquement une AlphaAnimation. Consultez la page Alpha Animation pour plus de détails sur comment l'utiliser. C'est assez simple, vous définissez ce que vous voulez et combien de temps vous voulez qu'il prenne.

+0

Malheureusement, le chronométrage des images est très important et je n'ai pas réussi à le faire correctement avec le threading ou en utilisant les moyens intégrés pour implémenter des animations. Merci d'avoir répondu. – RyanM

Questions connexes