IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Comportement étrange d'une TranslateAnimation au sein d'une HorizontalScrollView


Sujet :

Composants graphiques Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut Comportement étrange d'une TranslateAnimation au sein d'une HorizontalScrollView
    Bonjour à tous,

    Dans le contexte de mon travail, je me suis retrouvé à devoir développer pour Android et je découvre petit à petit les subtilités de ce monde assez particulier.

    Mon contexte est :
    - J'ai une HorizontalScrollView qui contient un RelativeLayout qui contient lui même une ImageView et un LinearLayout
    - Je charge dans ce LinearLayout une liste d'ImageView afin de constituer un menu horizontal comportant des icônes (nombre variable dépendant des préférences de l'utilisateur)
    - L'ImageView du RelativeLayout est un pointeur se plaçant derrière l'icône sélectionné

    Le tout donne ce résultat :


    Le code du xml de design est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <HorizontalScrollView 
        android:layout_width="fill_parent"
        android:layout_height="80dp"
        android:scrollbars="none"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:background="@drawable/channbar">
        <RelativeLayout
            android:id="@+id/layoutChannels"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
    	<ImageView 
    	    android:id="@+id/ivChannSelector"
    	    android:layout_height="80dp"
    	    android:layout_width="60dp"
    	    android:src="@drawable/ch_highlight"
    	    android:layout_below="@+id/llChannels"
    	    android:layout_alignParentTop="true"
    	    android:layout_marginTop="10dp"
    	    android:layout_marginLeft="0dp"/>
    	<LinearLayout 
    	    android:id="@+id/llChannels"
    	    android:orientation="horizontal"
    	    android:layout_height="fill_parent"
    	    android:layout_width="fill_parent"
    	    android:layout_alignParentRight="true">
    	</LinearLayout>
        </RelativeLayout>
    </HorizontalScrollView>
    Le code java est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    private static int CURR_CHANN_INDEX;
    private void LoadChannels() {
        	LinearLayout lChanns = (LinearLayout)findViewById(R.id.llChannels);
     
    		//Retrait préventif de toutes les vues enfants
    		lChanns.removeAllViews();
     
    		//Ajout des chaînes de la liste de l'utilisateur
        	for (int i = 0; i < channList.length; i++) {
        		ImageView iv = new ImageView(this);
     
        		final int channIndex = i;
     
        		//Image
        		File logoFile = new File(ImageUtils.GetLogoPath(channList[channIndex]));
        		if (logoFile.exists()) {
        			Bitmap myBmp = BitmapFactory.decodeFile(logoFile.getAbsolutePath());
        			iv.setImageBitmap(myBmp);
        		}
        		else {
        			iv.setImageResource(R.drawable.br_no_photo);
        		}
     
        		//Largeur et hauteur
        		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int)getResources().getDimension(R.dimen.chann_list_imageview_height), LinearLayout.LayoutParams.WRAP_CONTENT);
     
        		//Marges
        		params.setMargins((int)getResources().getDimension(R.dimen.chann_list_imageview_margin), 0, (int)getResources().getDimension(R.dimen.chann_list_imageview_margin), 0);
     
        		//Gravité
        		params.gravity = Gravity.CENTER_VERTICAL;
     
        		//Application des paramètres
        		iv.setLayoutParams(params);
     
        		//Ajout du click Listener
        		iv.setOnClickListener(new OnClickListener() {
        			public void onClick(View v) {
        				DISPLAY_CHANN_ID = channList[channIndex];
        				refreshBroadcasts(DISPLAY_CHANN_ID);
        				SelectChannel(channIndex);
        			}
        		});
     
        		//Ajout de la vue à la liste
        		lChanns.addView(iv);
    		}
        }
     
        private void SelectChannel(int newChannIndex) {
        	ImageView ivSel = (ImageView)findViewById(R.id.ivChannSelector);
        	ivSel.clearAnimation();
        	TranslateAnimation anim = new TranslateAnimation(CURR_CHANN_INDEX * (int)getResources().getDimension(R.dimen.chann_list_selector_width), newChannIndex * (int)getResources().getDimension(R.dimen.chann_list_selector_width), 0, 0);
        	anim.setDuration(500);
        	anim.setFillAfter(true);
        	ivSel.startAnimation(anim);
        	CURR_CHANN_INDEX = newChannIndex;
        }
    Et mon problème :
    Quand je clique sur un icône, le sélecteur se place bien à sa position, mais quand je fais un slide pour afficher les icones de droite et que je clique sur l'icone, le traitement se fait bien (il m'actualise mes données affichées en dessous) et mais le sélecteur reste a sa place et ne bouge que quand je commence à déplacer le scrollview... (je sais pas si le soucis est clair mais ce n'est pas facile à expliquer >_<)

    Bref, si quelqu'un à une idée (ou une question pour plus d'éclaircissements) je suis preneur ^^

    En vous remerciant par avance pour vos idées et potentielles solutions ^^

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Pourquoi tu n'utilises pas plus les GalleryView ? elle est faite pour cela et tu te poseras moins de question .

    GalleryView
    http://developer.android.com/resourc...o-gallery.html


    Sinon il faudrait que tu regardes aussi à changer les proriété de ton ivChannSelector, j'ai peur que ton animation sois perdu lors du scroll .

    Met ton selector à jour dans ces propriété puis de l'animation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    anim.setFillAfter(false);
    Tu ne travailles pas sur les animations mais bel et bien sur ton image, donc c'est celle ci qui doit être déplacé et modifié.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    Pour la GalleryView, j'ai l'impression (en regardant la doc) qu'elle ne correspond pas totalement à ce que je souhaite faire :/

    Le truc étrange est que l'animation n'est pas tout le temps perdue, mais uniquement après un scroll vers la droite (quand j'affiche les éléments à droite, ce qui fait plutôt un scroll vers la gauche en fait >_<)

    J'ai bien essayé le anim.setFillAfter(false); mais ça me replace le sélecteur en position originale à la fin de l'animation...(Donc derrière le premier icône)

    J'avoue que je patauge un peu ^^;

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    J'ai bien essayé le anim.setFillAfter(false); mais ça me replace le sélecteur en position originale à la fin de l'animation...(Donc derrière le premier icône)
    la proposition du anim.setFillAfter(false); correspondait avec le fiat qu'il fallait déplacer ton ivChannSelector, dynamiquement, donc changer ces propriété.

    En gros si tu veux il faut que la position originale deviennent la nouvelle position donc déplacer ton imageview plus avec l'animation mais dynamiquement dans le code. Après garder tu peux garder ton animation.

    Pour la GalleryView, j'ai l'impression (en regardant la doc) qu'elle ne correspond pas totalement à ce que je souhaite faire :/
    Pourtant cela y ressemble grandement .

    Le truc étrange est que l'animation n'est pas tout le temps perdue, mais uniquement après un scroll vers la droite (quand j'affiche les éléments à droite, ce qui fait plutôt un scroll vers la gauche en fait >_<)
    C'est bien ce que je pensais moi j'ai peur que ton animation soit un peu perdu avec le Scroll ^^
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    En gros si tu veux il faut que la position originale deviennent la nouvelle position donc déplacer ton imageview plus avec l'animation mais dynamiquement dans le code. Après garder tu peux garder ton animation.
    Euh... ^^; la j'avoue que je ne voie pas comment faire (j'ai essayé de rajouter une margin à l'ImageView suite à l'animation, mais le résultat est pas terrible (ça me met la marge en plus du déplacement)

    Je continue d'essayer dans ce sens...

    EDIT : Bon, en retirant l'animation, ça fonctionne (en modifiant juste la marge)... mais c'est pas terrible quand même niveau visuel :/

  6. #6
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Euh si tu ne veux pas t’embêter passe du Relative_Layout vers l'AbsoluteLayout ensuite avec les paramètres x et y tu peux déplacer ton selector

    http://developer.android.com/referen...outParams.html
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

Discussions similaires

  1. appeler une classe au sein d'une servlet
    Par switch1 dans le forum Hibernate
    Réponses: 10
    Dernier message: 22/05/2009, 21h11
  2. Faire une requête au sein d'une function
    Par Adorien dans le forum PL/SQL
    Réponses: 2
    Dernier message: 17/04/2009, 14h43
  3. Tester une valeur au sein d'une table
    Par titof90 dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/06/2007, 08h59
  4. L'affichage d'une photo au sein d'une page jsp
    Par debutantjak dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 10/05/2006, 17h11
  5. Insertion d'une Condition au sein d'une requete
    Par Redouane dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/02/2006, 10h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo