2012-04-04 8 views
6

私はTabActivtyにアニメーションを追加しようとしています。たとえば、ユーザーが2番目のタブを選択すると、新しいアクティビティが右側から来るようにします。ユーザーが最初のタブを選択すると、左側からアクティビティが得られます。Android - TabActivity with Transitionアニメーション

アニメーションを追加する方法を見つけましたが、もう一度アニメーションを追加したいと思います。ここで私が使用しているコードは次のとおりです。

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; 
} 

そして、私はそれを行うことができますどのように

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

ありがとうございました。

よろしくお願いいたします。

V.

+0

それが役に立つことがあります。http://www.techienjoy.com/android-tab-example.php – Nimit

答えて

12

これが正しく動作:

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

やアニメーションを:

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

あなたは右から左elseアニメーションからアニメーションを入れString tabIdを使用してifこのtabId==firstTabを確認する必要があります。

+0

[OK]を感謝します。しかし、私が欲しいのは 'if(previous_tab> tabId)animation = 'left to right''と' if(previous_tab Manitoba

1

あなたが好きなら、あなたはAndroidのサポートパッケージを使用することができます - あなたがあなたの活動を変更することができます少しの努力でhttp://developer.android.com/sdk/compatibility-library.html

をフラグメントを使用して、YouTubeアプリのようにタブにトランジションアニメーションを付けることができます。ここ はそれを実装する方法のサンプルコードである - http://developer.android.com/sdk/compatibility-library.html

編集を:あなたはサポートパッケージを使用したくない場合は、多分この実装は

プライベートクラスMyGestureDetectorが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); 
     } 
} 
を拡張するのに役立ちます

あなたのタブが変更されたリスナーでは、ジェスチャーの前に選択されたアニメーションと後で切り替えるアニメーションが分かっているので、適切なアニメーションをロードするだけです。長い答えを

申し訳ありませんが(ジェスチャーがスワイプ動作であるかどうかを判断するときと異なる画面密度を占めるかもしれない)

 @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; 
     } 
    }; 

はまた、あなたはあなたとカスタムジェスチャー検出器をonTouchListenerをオーバーライドすることでジェスチャーをキャッチする必要がありますしかし、私はそれが助けてくれることを願っています:)

+0

ええ、私は断片とそのスタックでそれを行うことができることを知っていますが、私のアプリが最低のAPIレベルを使用したいと思っています。また、私のアプリはほぼ完成しています。私はそのジェスチャーを実装する必要があります。 – Manitoba

5

私は共有したいこのコードに基づいてカスタムOnTabChangeListenerを書きました。うまくいけば、誰かがそれを使うことができます:)。クレジットは元のコードで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

努力のおかげで、うまく動作します! – wufoo

+0

タブ間でスライドするジェスチャーを追加しました。ここでクラスを見つけることができます:http://danielkvist.net/portfolio/animated-tabhost-with-slide-gesture-in-android – span