Aller au contenu

Reproduire la rotation de layout (voir widget genie meteo et news nex


zippeurfou

Recommended Posts

Salut,

Je cherche desesperement à reproduire ce que fait le widget du nexus one pour voir les news et la méteo. C'est à dire voir une liste d'onglet et pouvoir naviguer entre eux avec un drag sur l'ecran.

Malheureusement, le code source est privé et je n'arrive pas à le faire avec des tabWidget.

Aucune idée ? :)

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Non, ce n'est pas un view Flipper, car un view flipper ne suit pas le mouvement du doigt : il se déclenche ( et switch de view avec une animation ) ou ne se déclenche pas, mais on ne controle pas le niveau avec le doigt.

Je suis sur qu'on en a deja parlé sur ce forum, je pense qu'en passant du temps à rechecher, tu pourrais retrouver le sujet qui en parle. Dans mon souvenir, il y avait un lien vers des sources d'une solution à ce probleme.

Emmanuel / Alocaly

Lien vers le commentaire
Partager sur d’autres sites

Non, ce n'est pas un view Flipper, car un view flipper ne suit pas le mouvement du doigt : il se déclenche ( et switch de view avec une animation ) ou ne se déclenche pas, mais on ne controle pas le niveau avec le doigt.

Je suis sur qu'on en a deja parlé sur ce forum, je pense qu'en passant du temps à rechecher, tu pourrais retrouver le sujet qui en parle. Dans mon souvenir, il y avait un lien vers des sources d'une solution à ce probleme.

Emmanuel / Alocaly

Salut,

J'ai lu le code que tu m'a proposer. Il est bien mais semble à mon avis peut facile a l'utilisation. J'ai donc regarder les viewFlipper. On peut trouver un bon example ici :http://android-journey.blogspot.com/2009/12/android-viewflipper-and-slidingdrawer.html

Par contre, on peut utiliser l'action MotionEvent.ACTION_MOVE mais je n'arrive pas à faire quelquechose de concluant.

Je souhaiterai que si jamais mon mouvement est inférieur à 150 alors je lance une animation pour revenir a l'etat initial. De plus lorsque je drague, le layout d'a coté n'apparait pas...

Toute aide serait grandement apprecié !

Voici la partie du code interessant:

case MotionEvent.ACTION_MOVE:
           {
//TODO FIX THAT
               final View currentView = vf.getCurrentView();
               int position=(int) (touchevent.getX() - oldTouchValue);

               currentView.layout(position, 
                       currentView.getTop(), currentView.getRight(), 
                       currentView.getBottom());
//Try to get the next one (debugging only will crash on the last screen nullpointer) and move it in the same time of the other one
               vf.getChildAt(vf.getDisplayedChild() +1).layout(currentView.getLeft(), 
                       currentView.getTop(), position, 
                       currentView.getBottom());

//TODO get the new position and see if it's more or less than 150 from the old one. If it's less, go back to the original state with an animation...

               break;
               }

Voici le reste du code pour les curieux:

public class Main extends Activity {
   /** Called when the activity is first created. */
   private ViewFlipper vf;  
   private float oldTouchValue;
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       vf = (ViewFlipper) findViewById(R.id.layoutswitcher);
   }


 //for the previous movement
   public static Animation inFromRightAnimation() {

       Animation inFromRight = new TranslateAnimation(
       Animation.RELATIVE_TO_PARENT,  +1.0f, Animation.RELATIVE_TO_PARENT,  0.0f,
       Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
       );
       inFromRight.setDuration(350);
       inFromRight.setInterpolator(new AccelerateInterpolator());
       return inFromRight;
       }
   public static Animation outToLeftAnimation() {
       Animation outtoLeft = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,  -1.0f,
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
       );
       outtoLeft.setDuration(350);
       outtoLeft.setInterpolator(new AccelerateInterpolator());
       return outtoLeft;
       }    
   // for the next movement
   public static Animation inFromLeftAnimation() {
       Animation inFromLeft = new TranslateAnimation(
       Animation.RELATIVE_TO_PARENT,  -1.0f, Animation.RELATIVE_TO_PARENT,  0.0f,
       Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
       );
       inFromLeft.setDuration(350);
       inFromLeft.setInterpolator(new AccelerateInterpolator());
       return inFromLeft;
       }
   public static Animation outToRightAnimation() {
       Animation outtoRight = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,  +1.0f,
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
       );
       outtoRight.setDuration(350);
       outtoRight.setInterpolator(new AccelerateInterpolator());
       return outtoRight;
       }

   @Override
   public boolean onTouchEvent(MotionEvent touchevent) {
       switch (touchevent.getAction())
       {
           case MotionEvent.ACTION_DOWN:
           {
               oldTouchValue = touchevent.getX();
               break;
           }
           case MotionEvent.ACTION_UP:
           {
//                if(this.s==false) return false;
               float currentX = touchevent.getX();
               System.out.println("oldTouchValue "+oldTouchValue+"currentX "+currentX);
               if (oldTouchValue+150 < currentX)
               {

                   vf.setInAnimation(inFromLeftAnimation());
                   vf.setOutAnimation(outToRightAnimation());
                   vf.showNext();
               }
               if (oldTouchValue > currentX+150)
               {
                   vf.setInAnimation(inFromRightAnimation());
                   vf.setOutAnimation(outToLeftAnimation());
                   vf.showPrevious();
               }
           break;
           }
           case MotionEvent.ACTION_MOVE:
           {
               final View currentView = vf.getCurrentView();
               int position=(int) (touchevent.getX() - oldTouchValue);

               currentView.layout(position, 
                       currentView.getTop(), currentView.getRight(), 
                       currentView.getBottom());
               vf.getChildAt(vf.getDisplayedChild() +1).layout(currentView.getLeft(), 
                       currentView.getTop(), position, 
                       currentView.getBottom());

               break;
               }



   }
       return false;
   }
}

Modifié par zippeurfou
Lien vers le commentaire
Partager sur d’autres sites

  • 3 weeks later...

j'essaye également de faire ça en ce moment , j'ai un peu fait avancé le shmilblick (je pense)

if ((touchEvent.getX() - mOldTouchValue) > 0) {
               // place this view just left of the currentView
               leftView.layout(currentView.getLeft() - mViewFlipper.getWidth(), leftView.getTop(),
                       currentView.getLeft(), leftView.getBottom());
               leftView.setVisibility(View.VISIBLE);
               rightView.setVisibility(View.INVISIBLE);
           } else {
               // place this view just right of the currentView
               rightView.layout(currentView.getRight(), rightView.getTop(), currentView.getRight()
                       + mViewFlipper.getWidth(), rightView.getBottom());
               rightView.setVisibility(View.VISIBLE);
               leftView.setVisibility(View.INVISIBLE);

           }

situé dans MotionEvent.MOVE , ça permet de voir la view d'a coté

Le souci maintenant c'est que lorsque qu'on lache , le slide reprend du début et non de la ou il s'est arrété durant le MOVE , donc c'est très moche

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...