2016-03-03 3 views
0

Фон анимируется с помощью ValueAnimator и настраиваемого метода ValueAnimator.Update. В действии onCreate метод, с FragmentTransaction вызовами первого фрагмента. И из первого фрагмента, еще один FragmetTranstaction называется на основе щелчка кнопки пользователя. В первой транзакции все работает отлично, но во втором, переменные активности, используемые в ValueAnimator.Update, имеют значение null. В чем проблема?FragmentTransaction вызов из другого фрагмента делает переменные активности нулями

активность onCreate:

private const int TO_LEFT = 0; 
    private const int TO_RIGHT = 1; 
    private const long DURATION = 15000; 

    private int bgAnimDir = TO_LEFT; 
    private RectF mDisplayRect = new RectF(); 
    private Matrix matrix = new Matrix(); 
    private ValueAnimator bgAnimator; 

    [BindView(Resource.Id.background)] 
    ImageView background; 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 
     Cheeseknife.Bind(this); 

     background.Post(() => 
     { 
      animate(); 
     }); 


     fragmentTransaction = FragmentManager.BeginTransaction(); 
     fragmentTransaction.Add(Resource.Id.home_container, new Home(), "Home"); 
     fragmentTransaction.Commit(); 
    } 

Нулевая исключение указатель поднятый как для фона и матричных переменных

animate() функция:

private void animate() 
    { 
     updateDisplayRect(); 
     if (bgAnimDir == TO_LEFT) 
      animate(mDisplayRect.Left, mDisplayRect.Left - (mDisplayRect.Right - background.Width)); 
     else 
      animate(mDisplayRect.Left, 0.0f); 
    } 

    private void animate(float from, float to) 
    { 
     bgAnimator = ValueAnimator.OfFloat(from, to); 
     bgAnimator.Update += 
      (object sender, ValueAnimator.AnimatorUpdateEventArgs e) => 
      { 
       float value = (float)e.Animation.AnimatedValue; 
       matrix.Reset(); 
       matrix.PostTranslate(value, 0); 
       background.ImageMatrix = matrix; 
      }; 
     bgAnimator.SetDuration(DURATION); 
     bgAnimator.AnimationEnd += 
      (object sender, EventArgs e) => 
      { 
       bgAnimDir = bgAnimDir == TO_LEFT ? TO_RIGHT : TO_LEFT; 
       animate(); 
      }; 
     bgAnimator.Start(); 
    } 

Исключения воспитывался в bgAnimator.Update делегатом

+0

Вы хотите показать анимацию в неактивном фрагменте, и именно поэтому у вас есть это исключение –

ответ

0

Я решил проблема lem с помощью try, catch.

Вот моя новая функция одушевленные:

private void animate(float from, float to) 
    { 
     bgAnimator = ValueAnimator.OfFloat(from, to); 
     bgAnimator.Update += 
      (object sender, ValueAnimator.AnimatorUpdateEventArgs e) => 
      { 
       try 
       { 
        float value = (float)e.Animation.AnimatedValue; 
        matrix.Reset(); 
        matrix.PostTranslate(value, 0); 
        background.ImageMatrix = matrix; 
       } 
       catch 
       { 
        background = (ImageView)FindViewById(Resource.Id.background); 
       } 
      }; 
     bgAnimator.SetDuration(DURATION); 
     bgAnimator.AnimationEnd += 
      (object sender, EventArgs e) => 
      { 
       bgAnimDir = bgAnimDir == TO_LEFT ? TO_RIGHT : TO_LEFT; 
       animate(); 
      }; 
     bgAnimator.Start(); 
    } 

    private void updateDisplayRect() 
    { 
     try 
     { 
      mDisplayRect.Set(0, 0, background.Drawable.IntrinsicWidth, background.Drawable.IntrinsicHeight); 
      matrix.MapRect(mDisplayRect); 
     } 
     catch 
     { 
      background = (ImageView)FindViewById(Resource.Id.background); 
     } 
    } 

Просто заполнить нулевую переменную, когда его потребность быть!

Но, как вы можете догадаться, это не краткий ответ, чтобы объяснить, почему в этом процессе фон не имеет значения !.

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

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