2017-04-02 12 views
0

私のMainActivityには2つのアニメーション(FABとTABタイトル)があり、それらをonBackPressedで止めたいと思います。BackPressedでアニメーションを停止する方法は?

@Bind(R.id.fab_text) Button mFAB; 
... 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_drawer); 

    Animation animation = loadAnimation(MainDrawerActivity.this, R.anim.fab_scale_up_down); 
    animation.setRepeatCount(Animation.INFINITE); 
    animation.setAnimationListener(new SimpleAnimationListener() { 
     private long offset; 
     private long startTime; 

     @Override 
     public void onAnimationStart(Animation animation) { 
      startTime = System.currentTimeMillis(); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 
      final long now = System.currentTimeMillis(); 
      Timber.i("onAnimationRepeatFAB: elapeed seconds: %d", (now - startTime)/1000); 
      if ((now - startTime > 7000) && (offset % 4 == 0)) { // stop animation after X seconds 
       animation.setRepeatCount(0); 
      } else { 
       offset++; 
       animation.setStartOffset(offset % 4 == 0 ? 700 : 0); 
      } 
     } 
    }); 
    mFAB.startAnimation(animation); 

FABについては簡単です。

public void onBackPressed() { 
    mFAB.clearAnimation(); 

しかし、このように定義された他のアニメーションを停止するにはどうすればよいですか?私は以下のTABのアニメーションにアクセスする方法を知らない。

private void populateViewPager(List<Tab> tabs) { 
    // clear all listeners before populating new tabs 
    mTabLayout.setOnTabSelectedListener(null); 
    mViewPager.clearOnPageChangeListeners(); 

    if (mPagerAdapter == null) { 
     mPagerAdapter = new TabsPagerAdapter(this, getSupportFragmentManager()); 
     mViewPager.setAdapter(mPagerAdapter); 
    } 

    // populate tabs 
    mPagerAdapter.setTabs(tabs); 
    if (mPagerAdapter.getCount() > DEFAULT_TAB_POSITION) 
     mViewPager.setCurrentItem(DEFAULT_TAB_POSITION); 
    mTabLayout.setupWithViewPager(mViewPager); 

    // set animation on corresponding tabs 
    List<Tab> pagerTabs = mPagerAdapter.getTabs(); 
    for (int i = 0; i < pagerTabs.size(); i++) { 
     Tab pagerTab = pagerTabs.get(i); 
     if (pagerTab.isAnimated()) { 
      Timber.i("Animating tab: %s", pagerTab.getId()); 
      TabLayout.Tab tab = mTabLayout.getTabAt(i); 
      if (tab != null) { 
       // set custom view in order to get it back then 
       tab.setCustomView(R.layout.partial_tab_view); 

       // set animation on the custom view 
       Animation animation = loadAnimation(MainDrawerActivity.this, R.anim.tab_scale_up_down); 
       animation.setRepeatCount(Animation.INFINITE); 
       animation.setAnimationListener(new SimpleAnimationListener() { 
        private long offset; 
        private long startTime; 

        @Override 
        public void onAnimationStart(Animation animation) { 
         startTime = System.currentTimeMillis(); 
        } 

        @Override 
        public void onAnimationRepeat(Animation animation) { 
         final long now = System.currentTimeMillis(); 
         Timber.i("onAnimationRepeat: elapeed seconds: %d", (now - startTime)/1000); 
         if ((now - startTime > 7000) && (offset % 4 == 0)) { // stop animation after X seconds 
          animation.setRepeatCount(0); 
         } else { 
          offset++; 
          animation.setStartOffset(offset % 4 == 0 ? 700 : 0); 
         } 
        } 
       }); 
       //noinspection ConstantConditions 
       tab.getCustomView().setAnimation(animation); 
      } else { 
       Timber.w("tab!=null"); 
      } 
     } 
    } 
} 

答えて

0

Animationオブジェクトをglobal変数として宣言します。 cancel()メソッドを使用してアニメーションをキャンセルします。

これを試してください:あなたは、各タブに別々のアニメーションを作成しているように、オブジェクト変数としてアニメーションを保存する方法について

// Animation 
Animation animation; 

............ 
.............. 

private void populateViewPager(List<Tab> tabs) { 
    ................. 
    .............................. 

    animation = AnimationUtils.loadAnimation(MainDrawerActivity.this, R.anim.tab_scale_up_down); 

    .............. 
    ..................... 
} 

@Override 
public void onBackPressed() { 

    animation.cancel(); 
    super.onBackPressed(); 
} 
+0

詳細な例をお手伝いしてくれてありがとう!それは完璧に働いた。 – keikei38

+0

嬉しいです:) – FAT

0

ストアあなたのAnimationへの参照、そしてAnimationcancel()を呼び出します。

0

他の回答は、あなたのコードでは動作しません。
これは、表示されていないタブ用のアニメーションを作成しているという事実は、膨大なリソースの無駄です。 コードを変更し、ページャリスナーを追加し、現在のページでのみアニメーションを設定します。アニメーションオブジェクト変数を1つ作成し、それを現在のビューにアタッチします。ページが変更されたら、キャンセルし、破棄し、現在のページの新しいページを作成します(古いページを再利用できるかどうかはわかりません)。 Animation変数が1つしかないので、onBackPressedでその変数を取り消すこともできます。

+0

一度に1つのタブのタイトルのみがアニメーション化されます(サーバー上のJSONデータから選択されたタブ) – keikei38

+0

しかし、あなたは正しく、1つ以上のタブがアニメーション化されていれば、アニメーションはキャンセルされません。 – keikei38

関連する問題