2013-01-31 3 views
1

Я пытаюсь использовать заставку, чтобы покрыть задержку загрузки Карты Google (для Maps v2).AnimationListener onAnimationEnd не срабатывает при использовании postDelayed

Я хочу использовать ImageView в FrameLayout, которые должны исчезать через несколько секунд, и быть в состоянии перекрыть onAnimationEnd, чтобы скрыть экран заставки ImageView-х.

При запуске анимации без задержки, onAnimationEnd вызывается соответствующим образом:

new Animations().animateAlphaForLayout(splashLayout, 2000); 

Проблема заключается в том, когда я пытаюсь запустить анимацию с postDelayedonAnimationEnd не дозвонились вообще:

splashLayout.postDelayed(new Runnable() { 

    @Override 
    public void run() { 
     new Animations().animateAlphaForLayout(splashLayout, 2000); 
    } 

}, 3000); 

код Animations класс это:

import android.view.View; 
import android.view.ViewGroup; 
import android.view.animation.AlphaAnimation; 
import android.view.animation.Animation; 
import android.view.animation.AnimationSet; 
import android.view.animation.LayoutAnimationController; 

public class Animations { 

    public void animateAlphaForLayout(final ViewGroup viewGroup, int duration) { 
     AnimationSet set = new AnimationSet(true); 

     Animation animation = new AlphaAnimation(1.0f, 0.0f); 
     animation.setRepeatCount(0); 
     animation.setFillAfter(true); 
     animation.setDuration(duration); 
     animation.setAnimationListener(new Animation.AnimationListener() { 

      @Override 
      public void onAnimationStart(Animation animation) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       viewGroup.setVisibility(View.GONE); 
      } 
     }); 
     set.addAnimation(animation); 

     LayoutAnimationController controller = new LayoutAnimationController(set, 0.0f); 
     viewGroup.setLayoutAnimation(controller); 
     } 

} 

Кто-нибудь знает способ сделать это для Android 2.3 и выше (API 10+)?

Спасибо!

+0

Вопрос в том, к какому Handler вы отправляете этот Runnable и что делает этот обработчик. Если этот обработчик является вашим основным потоком пользовательского интерфейса и он занят, он никогда не получит возможности обработать ваш запрос. –

+0

Ой, подождите, вы отправляете его в представление, поэтому отправляете его в основной поток пользовательского интерфейса. Итак, что делает ваш основной поток пользовательского интерфейса? –

+0

Да, я использую представление для публикации, и, как я уже сказал, запрос обрабатывается, потому что анимация работает. Единственное, что не работает, это «onAnimationEnd» слушателя. В потоке интерфейса я просто показываю SupportMapFragment. –

ответ

1

Простое решение, которое получает результат я хотел (то есть, чтобы показать ImageView в течение нескольких секунд, а затем исчезают его и установить его в GONE):

Поскольку postDelayed был виновником в моей предыдущей попытки, Я бросил его в пользу использования Animation's setStartOffset(startOffset).

Это означает, что я просто затянул начало анимации с использованием интервала, который я использовал первоначально для postDelayed. Я до сих пор не знаю, почему postDelayed испортил слушателю анимацию.

+0

Интересно. Спасибо за обновление! –

0

У меня есть вложенные LinearLayouts, а один - parentHolder другой - menuHolder внутри parentHolder. Когда я коснулся наружу родительского держателя, я скрываю внутренний.

package com.fmc.component; 

import com.fmc.marketing.tanitim.R; 
import android.view.animation.AlphaAnimation; 
import android.view.animation.Animation; 
import android.view.animation.Animation.AnimationListener; 
import android.view.animation.AnimationSet; 
import android.widget.LinearLayout; 

public class NavigatorTest { 

public void AnimeEt(LinearLayout llParentHolder) { 
    final LinearLayout llHolder = (LinearLayout) llParentHolder.findViewById(R.id.llHolder); 
    AnimationSet aset = new AnimationSet(true); 
    AlphaAnimation alpha = new AlphaAnimation(1, 0); 
    alpha.setStartOffset(500); 
    alpha.setDuration(1000); 
    aset.addAnimation(alpha); 
    alpha.setAnimationListener(new AnimationListener() { 

     @Override 
     public void onAnimationStart(Animation animation) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      llHolder.setVisibility(LinearLayout.GONE); 
     } 
    }); 
    llHolder.startAnimation(aset); 
} 

}

0

Там может быть кто-то еще с этим вопросом и не нашел решение -Даже хотя читает много StackOverflow answers-, как я!

Так что мой случай был: я animatorSet и

не было единого мнения, что я мог бы назвать clearAnimation на, я не звала свою анимацию backgroundThread -Какой вы никогда не должны делать это, btw- В качестве решения я действительно вызывал animatorSet.end() прямо перед аниматоромSet.start()

 Смежные вопросы

  • Нет связанных вопросов^_^