2015-06-29 17 views
10

Auf meiner Haupttätigkeit habe ich einen Viewflipper mit drei Kind Ansichten. Nach dem ersten Start der App, wenn ich den ersten Streichen von rechts nach links mache, ändert sich die Ansicht, aber es gibt keine Folienanimation. Nach dem ersten Streichen funktioniert die Animation wie erwartet beim Streichen in beide Richtungen. Ich folge this Tutorial. Der Code, den ich verwenden ist:Viewflipper Animation funktioniert nicht beim ersten Streichen

public boolean onTouchEvent(MotionEvent touchevent) 
{ 
    switch (touchevent.getAction()) 
    { 
     // when user first touches the screen 
     case MotionEvent.ACTION_DOWN: 
     { 
      lastX = touchevent.getX(); 
      break; 
     } 
     case MotionEvent.ACTION_UP: 
     { 
      float currentX = touchevent.getX(); 

      // left to right swipe 
      if (lastX < currentX) 
      { 
       if (mViewFlipper.getDisplayedChild() == 0) 
        break; 

       mViewFlipper.setInAnimation(this, R.anim.in_from_left); 
       mViewFlipper.setOutAnimation(this, R.anim.out_to_right); 

       mViewFlipper.showPrevious(); 
      } 

      // right to left swipe 
      if (lastX > currentX) 
      { 
       if (mViewFlipper.getDisplayedChild() == mViewFlipper.getChildCount() - 1) 
        break; 

       mViewFlipper.setInAnimation(this, R.anim.in_from_right); 
       mViewFlipper.setOutAnimation(this, R.anim.out_to_left); 

       mViewFlipper.showNext(); 
      } 

      break; 
     } 
    } 

    return false; 
} 

Wenn ich den Code debuggen, ich sehe keine Unterschiede zwischen, wenn die Animation funktioniert, und wenn es nicht ist. Außerdem sehe ich dieses Verhalten auf einem tatsächlichen Gerät und dem Emulator. Was habe ich verpasst? Ich kann die XML-Animationsdateien und die View-XML-Datei posten, wenn sie benötigt werden.

EDIT:

Der einzige Weg, ich bin in der Lage dazu wie die folgend in dem onCreate Verfahren einzustellen erwartete an der Arbeit ist:

mViewFlipper.setInAnimation(this, R.anim.in_from_right); 
    mViewFlipper.setOutAnimation(this, R.anim.out_to_left); 
    mViewFlipper.setFlipInterval(10000); 
    mViewFlipper.startFlipping(); 

ich dann stopFlipping nennen() auf dem zuerst wischen. Das Interessante an mir ist, dass die Animation beim ersten Streichen mit diesen Änderungen funktioniert, selbst wenn die erste automatische Spiegelung nicht stattgefunden hat. Wenn ich die Animation jedoch einfach in der onCreate-Methode ohne Aufruf der startFlipping() -Methode festlege, ist die Animation beim ersten Streichen immer noch nicht vorhanden. Kann jemand eine Erklärung geben, warum dieses Verhalten auftritt?

+0

Um zu überprüfen, schaut man sich den [Quellcode] (http://bit.ly/1dMu0dc) der ViewFlipper-Klasse an, wenn Sie ViewFlipper.showNext() aufrufen, wird die ViewAnimator.showOnly (int position) -Methode aufgerufen . Dies ist die Validierung, die innerhalb dieser Methode ausgeführt wird: final boolean animate = (! MFirstTime || ManimateFirstTime); showOnly (childIndex, animate) ;. Was also passieren könnte ist, dass die Animation beim ersten Flip einfach ignoriert wird. Ich bin nicht 100% darüber, aber Sie können es überprüfen, indem Sie mViewFlipper.setAnimateFirstView (true) in onCreate hinzufügen (anstelle der Zeilen, die Sie in der Bearbeitung haben) – mmark

+0

Ich werde es versuchen, wenn ich die Chance bekomme. –

+0

@mmark Das hat funktioniert. Sende es als Antwort und ich akzeptiere es. Vielen Dank! –

Antwort

1

den Quellcode der Blick durch ViewFlipper Klasse, die ViewFlipper.showNext() ruft intern die ViewAnimator.showOnly (int position) -Methode .

Dies ist die Validierung innerhalb dieser Methode durchgeführt:

void showOnly(int childIndex) { 
     final boolean animate = (!mFirstTime || mAnimateFirstTime); 
     showOnly(childIndex, animate); 
    } 

, um so zu erreichen, was Sie wollen, Sie werden die ViewFlipper sagen müssen, um das erste Flip in Ihrem Activity.onCreate zu animieren:

@Override 
    void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.my_activity); 
     mViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper); 
     mViewFlipper.setAnimateFirstView(true); 
    } 

HINWEIS:

ich konnte dies erreichen, ohne mViewFlipper.setAnimateFirst Aufruf Zeigen Sie (wahr) mit API-Ebene 22 an. Aber es scheint nicht dasselbe auf früheren Versionen zu funktionieren.

+0

funktioniert nicht für mich –

2

Zuerst haben Sie nicht wahr algorythm Ihrer onTouchEvent. Jetzt erhalten Sie etwas wie Inversion mit falscher Einstellung der Animationsreihenfolge.

versuchen, meine onTouchEvent zu verwenden, ist diese Arbeit für mich wie ein Zauber:

public boolean onTouchEvent(MotionEvent touchevent) 
    { 
     switch (touchevent.getAction()) 
     { 
      // when user first touches the screen to swap 
      case MotionEvent.ACTION_DOWN: 
      { 
       lastX = touchevent.getX(); 
       break; 
      } 
      case MotionEvent.ACTION_UP: 
      { 
       float currentX = touchevent.getX(); 

       // if left to right swipe on screen 
       if (lastX < currentX) 
       { 
        // If no more View/Child to flip 
        if (viewFlipper.getDisplayedChild() == 0) 
         break; 

        // set the required Animation type to ViewFlipper 
        // The Next screen will come in form Left and current Screen will go OUT from Right 
        viewFlipper.setInAnimation(this, R.anim.in_from_left); 
        viewFlipper.setOutAnimation(this, R.anim.out_to_right); 
        // Show the next Screen 
        viewFlipper.showNext(); 
       } 

       // if right to left swipe on screen 
       if (lastX > currentX) 
       { 
        if (viewFlipper.getDisplayedChild() == 1) 
         break; 
        // set the required Animation type to ViewFlipper 
        // The Next screen will come in form Right and current Screen will go OUT from Left 
        viewFlipper.setInAnimation(this, R.anim.in_from_right); 
        viewFlipper.setOutAnimation(this, R.anim.out_to_left); 
        // Show The Previous Screen 
        viewFlipper.showPrevious(); 
       } 
       break; 
      } 
     } 
     return true; 
    } 
+0

Ich habe die Änderungen vorgenommen, aber das Ergebnis ist das gleiche. Beim ersten Streichen gibt es keine Animation. Bei jedem weiteren Wischen funktioniert die Animation wie erwartet. –

+1

Vielleicht sind Ihre Animationsdateien nicht korrekt. – GIGAMOLE

+1

Ich glaube nicht, da die Animation funktioniert, nur nicht beim ersten Streichen. Siehe meine Bearbeitung. –

0
Try to use this gesture for swipe with animation just get animation swipe left to right and right to left and put inside this: 

    final GestureDetector gesture = new GestureDetector(getActivity(), 
       new GestureDetector.SimpleOnGestureListener() { 

        @Override 
        public boolean onDown(MotionEvent e) { 
         return true; 
        } 

        @Override 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
          float velocityY) { 
         Log.i("null", "onFling has been called!"); 
         final int SWIPE_MIN_DISTANCE = 80; 
         final int SWIPE_MAX_OFF_PATH = 150; 
         final int SWIPE_THRESHOLD_VELOCITY = 100; 
         try { 
          if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
           return false; 
          if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
            && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
           try { 

            //your swipe code 
           } catch (Exception e) { 
            n = -1; 
           } 

          } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
            && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
           try { 

//your swipe code 
         } catch (Exception e) { 

           } 

          } 
         } catch (Exception e) { 
         } 
         return super.onFling(e1, e2, velocityX, velocityY); 
        } 
       }); 
     yourFullRelativeLayout.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return gesture.onTouchEvent(event); 
      } 
     }); 
     yourView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return gesture.onTouchEvent(event); 
      } 
     }); 
Verwandte Themen