2012-04-04 16 views
6

Ich versuche eine Animation zu meinem TabActivty hinzuzufügen. Zum Beispiel, wenn der Benutzer die 2. Registerkarte auswählt, möchte ich, dass die neue Aktivität von rechts kommt. Wenn der Benutzer die erste Registerkarte auswählt, möchte ich, dass die Aktivität von links kommt.Android - TabActivity mit Transition-Animation

Ich habe gefunden, wie man eine Animation hinzufügt, aber ich möchte eine wieder hinzufügen. Hier ist der Code Ich verwende:

public 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(240); 
    inFromRight.setInterpolator(new AccelerateInterpolator()); 
    return inFromRight; 
} 

Und

getTabHost().setOnTabChangedListener(new OnTabChangeListener() { 
     public void onTabChanged(String tabId) 
     { 
      View currentView = getTabHost().getCurrentView(); 
      currentView.setAnimation(inFromRightAnimation()); 
     } 
}); 

Wie kann ich das tun?

Danke.

Grüße.

V.

+0

kann es nützlich sein: http://www.techienjoy.com/android-tab-example.php – Nimit

Antwort

12

Das funktioniert richtig:

getTabHost().setOnTabChangedListener(new OnTabChangeListener() { 
    public void onTabChanged(String tabId) 
    { 
      View currentView = getTabHost().getCurrentView(); 
      if (getTabHost().getCurrentTab() > currentTab) 
      { 
       currentView.setAnimation(inFromRightAnimation()); 
      } 
      else 
      { 
       currentView.setAnimation(outToRightAnimation()); 
      } 

      currentTab = getTabHost().getCurrentTab(); 
    } 
}); 

und die Animationen:

public 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(240); 
    inFromRight.setInterpolator(new AccelerateInterpolator()); 
    return inFromRight; 
} 

public Animation outToRightAnimation() 
{ 
    Animation outtoLeft = 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); 
    outtoLeft.setDuration(240); 
    outtoLeft.setInterpolator(new AccelerateInterpolator()); 
    return outtoLeft; 
} 
1

Sie haben String tabId zu verwenden und überprüfen if diese tabId==firstTab dann Animation von rechts von links else Animation setzen.

+0

Ok danke. Aber was ich will ist etwas wie 'if (previous_tab> tabId) animation =' left to right'' und 'if (previous_tab Manitoba

1

Wenn Sie möchten, können Sie Android Support Package verwenden - http://developer.android.com/sdk/compatibility-library.html

Mit wenig Aufwand Sie Ihre Aktivität ändern können um Fragmente zu verwenden, sodass deine Tabs wie die YouTube-App über Übergangsanimationen verfügen können. Hier ist ein Beispielcode, wie es zu implementieren - http://developer.android.com/sdk/compatibility-library.html

Edit: Wenn Sie möchten vielleicht nicht Support-Paket verwenden, wird diese Implementierung

private Klasse MyGestureDetector helfen erweitert SimpleOnGestureListener {

 private static final int SWIPE_MIN_DISTANCE = 120; 
     private static final int SWIPE_MAX_OFF_PATH = 250; 
     private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     //get density 
      final DisplayMetrics metrics = getResources().getDisplayMetrics(); 
      final float density = metrics.density; 
     //System.out.println(" in onFling() :: "); 
      //off path 
      if (Math.abs(e1.getY() - e2.getY()) > density*SWIPE_MAX_OFF_PATH) 
       return false; 
      //fling from right to left 
      if (e1.getX() - e2.getX() > density*SWIPE_MIN_DISTANCE && Math.abs(velocityX) > density*SWIPE_THRESHOLD_VELOCITY) { 
       //if the first tab is selected 
       if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_info))) { 
        //switch to second tab and save current selection 
        tabs.setCurrentTab(1); 
        currentSelection = tabs.getCurrentTabTag(); 
       } 
       //if the second tab is selected 
       else if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_details))) { 
        //switch to second tab and save current selection 
        tabs.setCurrentTab(2); 
        currentSelection = tabs.getCurrentTabTag(); 
       } 
      } 
      //fling from left to right 
      else if (e2.getX() - e1.getX() > density*SWIPE_MIN_DISTANCE && Math.abs(velocityX) > density*SWIPE_THRESHOLD_VELOCITY) { 

       //if the second tab is selected 
       if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_details))) { 
        //switch to second tab and save current selection 
        tabs.setCurrentTab(0); 
        currentSelection = tabs.getCurrentTabTag(); 
       } 
       //if the third tab is selected 
       else if(currentSelection.equalsIgnoreCase(getString(R.string.tab_details_company))) { 
        //switch to second tab and save current selection 
        tabs.setCurrentTab(1); 
        currentSelection = tabs.getCurrentTabTag(); 
       } 
      } 
      return super.onFling(e1, e2, velocityX, velocityY); 
     } 
} 

und dann auf Ihrem Tab geändert Listener laden Sie einfach die entsprechende Animation, da Sie wissen, welche vor der Geste ausgewählt wurde, und die, auf die wir nach wechseln.

 @Override 
     public void onTabChanged(String tabId) { 



      //if the first tab is selected 
      if(currentSelection.equalsIgnoreCase(getResources().getString(R.string.tab_details_info))) { 
       //if we switch to second 
       if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_details))) { 
        linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out)); 
        linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in)); 
        linearCompany.setAnimation(null); 
       } 
       //if switch to third 
       else if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_company))) { 
        linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out)); 
        linearDetails.setAnimation(null); 
        linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in)); 
       } 
      } 
      //if the second tab is selected 
      else if(currentSelection.equalsIgnoreCase(getResources().getString(R.string.tab_details_details))) { 
       //if we switch to first 
       if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_info))) { 
        linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in)); 
        linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out)); 
        linearCompany.setAnimation(null); 
       } 
       //if switch to third 
       else if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_company))) { 
        linearInfo.setAnimation(null); 
        linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out)); 
        linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in)); 
       } 
      } 
      //if the third tab is selected 
      else if(currentSelection.equalsIgnoreCase(getResources().getString(R.string.tab_details_company))) { 
       //if we switch to first 
       if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_info))) { 
        linearInfo.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in)); 
        linearDetails.setAnimation(null); 
        linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out)); 
       } 
       //if switch to second 
       else if(tabId.equalsIgnoreCase(getResources().getString(R.string.tab_details_details))) { 
        linearInfo.setAnimation(null); 
        linearDetails.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in)); 
        linearCompany.setAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out)); 
       } 
      } 

      currentSelection = tabId; 
     } 
    }; 

Darüber hinaus müssen Sie die Geste fangen, indem Sie die onTouchListener zwingenden mit Ihnen individuelle Geste Detektor (und erklären vielleicht für unterschiedliche Bildschirmdichte bei der Bestimmung, ob eine Geste eine Swipe-Aktion ist)

Sorry für die lange Antwort , aber ich hoffe es hilft :)

+0

Ja, ich weiß, dass ich das mit Fragmenten und ihrem Stack machen kann, aber ich möchte, dass meine App den niedrigsten API-Level verwendet.Außerdem ist meine App fast fertig. Ich muss diese Geste nur umsetzen. – Manitoba

5

Ich schrieb einen benutzerdefinierten OnTabChangeListener basierend auf diesem Code, den ich teilen wollte. Hoffentlich kann jemand es benutzen :). Das Guthaben geht an den Originalcode von Vomenki.

package net.danielkvist.receipttracker.listener; 

import android.view.View; 
import android.view.animation.AccelerateInterpolator; 
import android.view.animation.Animation; 
import android.view.animation.TranslateAnimation; 
import android.widget.TabHost; 
import android.widget.TabHost.OnTabChangeListener; 

/** 
* A custom OnTabChangeListener that uses the TabHost its related to to fetch information about the current and previous 
* tabs. It uses this information to perform some custom animations that slide the tabs in and out from left and right. 
* 
* @author Daniel Kvist 
* 
*/ 
public class AnimatedTabHostListener implements OnTabChangeListener 
{ 

    private static final int ANIMATION_TIME = 240; 
    private TabHost tabHost; 
    private View previousView; 
    private View currentView; 
    private int currentTab; 

    /** 
    * Constructor that takes the TabHost as a parameter and sets previousView to the currentView at instantiation 
    * 
    * @param tabHost 
    */ 
    public AnimatedTabHostListener(TabHost tabHost) 
    { 
     this.tabHost = tabHost; 
     this.previousView = tabHost.getCurrentView(); 
    } 

    /** 
    * When tabs change we fetch the current view that we are animating to and animate it and the previous view in the 
    * appropriate directions. 
    */ 
    @Override 
    public void onTabChanged(String tabId) 
    { 

     currentView = tabHost.getCurrentView(); 
     if (tabHost.getCurrentTab() > currentTab) 
     { 
      previousView.setAnimation(outToLeftAnimation()); 
      currentView.setAnimation(inFromRightAnimation()); 
     } 
     else 
     { 
      previousView.setAnimation(outToRightAnimation()); 
      currentView.setAnimation(inFromLeftAnimation()); 
     } 
     previousView = currentView; 
     currentTab = tabHost.getCurrentTab(); 

    } 

    /** 
    * Custom animation that animates in from right 
    * 
    * @return Animation the Animation object 
    */ 
    private 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); 
     return setProperties(inFromRight); 
    } 

    /** 
    * Custom animation that animates out to the right 
    * 
    * @return Animation the Animation object 
    */ 
    private 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); 
     return setProperties(outToRight); 
    } 

    /** 
    * Custom animation that animates in from left 
    * 
    * @return Animation the Animation object 
    */ 
    private 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); 
     return setProperties(inFromLeft); 
    } 

    /** 
    * Custom animation that animates out to the left 
    * 
    * @return Animation the Animation object 
    */ 
    private 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); 
     return setProperties(outtoLeft); 
    } 

    /** 
    * Helper method that sets some common properties 
    * @param animation the animation to give common properties 
    * @return the animation with common properties 
    */ 
    private Animation setProperties(Animation animation) 
    { 
     animation.setDuration(ANIMATION_TIME); 
     animation.setInterpolator(new AccelerateInterpolator()); 
     return animation; 
    } 
} 
+0

Danke für die Mühe, funktioniert gut! – wufoo

+0

Ich habe auch Gesten hinzugefügt, um zwischen den Tabs jetzt zu schieben, können Sie die Klasse hier finden: http://danielkvist.net/portfolio/animated-tabhost-with-slide-gesture-in-android – span

Verwandte Themen