2017-04-02 155 views
0

在我的MainActivity中,我有2个动画(FAB和TAB标题),我想阻止它们在背部按下。如何停止动画onBackPressed?

@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

关于保存动画作为一个对象变量,其他的答案,也不会在你的代码工作,因为要创建为每个标签的独立动画。
话虽如此,您创建不可见标签的动画是一个巨大的资源浪费。 更改您的代码,添加寻呼机侦听器,并仅在当前页面上设置动画。通过创建单个动画对象变量来实现,将其附加到当前视图。当页面发生变化时,取消它,将其销毁并为当前页面创建一个新页面(不确定是否可以重新使用旧页面)。既然你有一个动画变量,你也可以在onBackPressed中取消它。

+0

一次只有一个选项卡标题是动画的(哪个选项卡是从服务器上的JSON数据中选择的) – keikei38

+0

但是你说得对,如果多个选项卡是动画的,那么动画不会被取消。 – keikei38