2015-06-26 112 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; 

內這種方法解決了我所有的問題顯然。但是,這是一個好的解決方案?任何其他建議是值得歡迎的。