2017-04-02 7 views
0

In meiner MainActivity habe ich 2 Animationen (FAB und einen TAB-Titel) und möchte sie auf BackPressed stoppen.Wie man eine Animation auf BackPressed stoppt?

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

Über die FAB ist es einfach.

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

Aber wie stoppe ich die andere so definierte Animation? Ich weiß nicht, wie ich auf die Animation des TAB unten zugreifen kann.

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

Antwort

0

Deklarieren Sie ein Animation Objekt als eine global Variable. Verwenden Sie die Methode cancel(), um die Animation abzubrechen.

Versuchen Sie folgendes:

// 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

Vielen Dank für die Hilfe mit detaillierten Beispiel! Es hat perfekt funktioniert. – keikei38

+0

Gut zu wissen :) – FAT

0

Die anderen Antworten über die Animation als eine Objektvariable zu speichern, werden nicht in Ihrem Code arbeiten, wie Sie eine separate Animation für jeden Reiter zu schaffen.
Die Tatsache, dass Sie Animationen für Registerkarten erstellen, die nicht sichtbar sind, ist eine enorme Verschwendung von Ressourcen. Ändern Sie Ihren Code, fügen Sie einen Pager-Listener hinzu und legen Sie die Animation nur auf der aktuellen Seite fest. Erstellen Sie dazu eine einzelne Animationsobjektvariable, und hängen Sie sie an die aktuelle Ansicht an. Wenn sich die Seite ändert, brechen Sie sie ab, zerstören Sie sie und erstellen Sie eine neue für die aktuelle Seite (nicht sicher, ob Sie die alte Seite wiederverwenden können). Jetzt, da Sie eine einzelne Animationsvariable haben, können Sie sie auch in onBackPressed abbrechen.

+0

Nur ein Tab-Titel ist zu einer Zeit animiert (welche Registerkarte wird aus JSON-Daten auf dem Server ausgewählt) – keikei38

+0

Aber Sie haben Recht, wenn mehr als eine Registerkarte animiert ist, dann wird die Animation nicht abgebrochen. – keikei38