2016-03-03 87 views
0

使用ValueAnimator和定制的ValueAnimator.Update方法为背景设置动画。在活动onCreate方法中,用FragmentTransaction第一个片段调用。并从第一个片段中,另一个FragmetTranstaction根据用户按钮点击进行调用。在第一个事务中,一切都很完美,但在第二个事务中,ValueAnimator.Update中使用的活动变量为空。哪里有问题?片段另一个片段的事务调用使活动变量为空

活动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()功能:在bgAnimator.Update代表提出

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

例外

+0

你想在非活动片段中显示动画,这就是为什么你有这个例外 –

回答

0

我解决概率通过使用尝试,抓住lem。

这里是我的新动画功能:

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

只需填写空变量时,其需要的!

但是,正如你所猜测的,这不是一个简单的答案,可以解释为什么背景在这个过程中变为空。