2015-06-26 68 views
0

我试图做一个简单的动画来缩放相对布局的宽度。我使用这段代码设法做到了,但动画的执行速度非常快,即使持续时间为5000毫秒。我无法看到中间结果。任何建议?动画相对布局宽度变化

RelativeLayout baseLayer; 
RelativeLayout fillLayer; 
public void animate(int duration){ 
    Animation a = new Animation() 
    { 
     @Override 
     protected void applyTransformation(float interpolatedTime, Transformation t) 
     { 
      fillLayer.getLayoutParams().width = (int)(baseLayer.getLayoutParams().width * interpolatedTime); 
      fillLayer.requestLayout(); 
     } 

     @Override 
     public boolean willChangeBounds() { 
      return true; 
     } 
    }; 

    a.setDuration(duration); 
    a.setInterpolator(new LinearInterpolator()); 
    fillLayer.startAnimation(a); 
} 

回答

0

我找到了解决方案。问题是我从OnStart()调用动画方法。现在我从onWindowFocusChanged()调用它。

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    testBar.animate(2000,0.8); 
} 

RelativeLayout baseLayer; 
RelativeLayout fillLayer; 
public void animate(int duration,float fillPercentage){ 

    final int targetWidth = (int)(baseLayer.getMeasuredWidth() * fillPercentage);   

    Animation a = new Animation() 
    { 
     @Override 
     protected void applyTransformation(float interpolatedTime, Transformation t) 
     { 
      fillLayer.getLayoutParams().width = (int)(targetWidth * interpolatedTime); 
      fillLayer.requestLayout(); 
     } 

     @Override 
     public boolean willChangeBounds() { 
      return true; 
     } 
    }; 

    a.setDuration(duration); 
    a.setInterpolator(new LinearInterpolator()); 
    fillLayer.startAnimation(a); 
} 

而且在整个过程中,我从其他文章中发现了一种替代方法来完成同样的工作。但是同样需要从onWindowFocusChanged()中调用该方法。

ValueAnimator.ofObject(new WidthEvaluator(fillLayer), fillLayer.getLayoutParams().width, targetWidth).setDuration(2000).start(); 

class WidthEvaluator extends IntEvaluator { 

    private View v; 
    public WidthEvaluator(View v) { 
    this.v = v; 
    } 

    @Override 
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) { 
     int num = (Integer)super.evaluate(fraction, (Integer)startValue, (Integer)endValue); 
     ViewGroup.LayoutParams params = v.getLayoutParams(); 
     params.width = num; 
     v.setLayoutParams(params); 
     return num; 
    } 
} 

[Update解决方案]

继给我增加了我的自定义视图到一个ListView,然后将问题重新启动。 ListView应该在视图获取其实际大小之前做好准备。所以动画无法完成,因为getMeasuredWidth()总是返回0(这是从头开始的问题)。

所以我做了什么是我在OnCreate()中使用此代码片段。

ViewTreeObserver vto = listBars.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() {  
      if (!HackClass.GlobalDrawnFlag) {      
       adapter.notifyDataSetChanged(); 
       HackClass.GlobalDrawnFlag = true; 
      } 
     } 
    }); 

这我的列表适配器类

if (item.getMeasuredWidth==0) 
    HackClass.GlobalDrawnFlag = false; 
else 
    HackClass.GlobalDrawnFlag = true; 

内这种方法解决了我所有的问题显然。但是,这是一个好的解决方案?任何其他建议是值得欢迎的。