2012-01-15 31 views
0

所以,我的問題有點類似這兩個問題:安卓的onDraw不斷呼籲或動畫彈回原來的位置

Custom View onDraw is constantly called

android: onDraw is called constantly

我有一個自定義類擴展ImageView的我將RotateAnimation應用於。動畫使用輸入的x和y座標來執行從最後一個角度到下一個角度的旋轉,以便用戶可以將ImageView從-360度變成360度。當我使用的onDraw()這個代碼一切看起來完美的屏幕(動畫設定爲在代碼下文):

@Override 
protected void onDraw(Canvas canvas) { 
    Log.d(TAG, "It is drawn again!"); 
    this.setAnimation(anim); 
    super.onDraw(canvas); 
} 

這裏的問題是,以同樣的方式在其他職位提到,動畫調用onDraw調用動畫等,可能通過RotateAnimation類中的invalidate()。這是否正確觀察?輸出是完美的,因爲ImageView總是停留在當前計算出的角度,但動畫調整因此繼續進行,消耗大量的功率和容量。

爲了解決這個問題,我嘗試在計算動畫參數的方法中移動this.setAnimation(anim)(請忽略isClockWise(),calculateAngleToMove()和其他非Android的東西,它們按預期工作):

private void turnWheel(){ 
    float angle = 0; 

    if (isClockWise()){ 
     angle = calculateAngleToMove();   
     anim = new RotateAnimation(current_angle, angle, center_x, center_y); 
     anim.setFillAfter(true); 
     anim.setFillEnabled(true); 
     current_angle += angle; 
    } 
    else{ 
     angle = - calculateAngleToMove(); 
     anim = new RotateAnimation(current_angle, angle, center_x, center_y); 
     anim.setFillAfter(true); 
     anim.setFillEnabled(true); 
     current_angle += angle; 
    } 

    if (current_angle > 360){ 
     current_angle = current_angle - 360; 
    } 
    if (current_angle < -360){ 
     current_angle = current_angle + 360; 
    } 

    this.setAnimation(anim); 
    this.invalidate(); //Calls onDraw() 

} 

這解決了問題的onDraw不斷被調用,但它創建另一:當用戶按下,保持並轉動ImageView的,它卡來回零角度和當前角度之間。當用戶放開ImageView時,它會回到零角度。當用戶不提供輸入時,總希望ImageView在變量current_angle上旋轉。我已經嘗試了anim.setFillAfter(true),anim.setFillEnabled(true),invalidate()和this.startAnimation(anim)的不同版本,但它們似乎從未對此問題產生任何影響。

哪裏是調用this.setAnimation(anim)的最佳位置?

回答

0

我可能會建議不要使用Animation框架將靜態轉換應用於視圖,以便您不必處理每次應用新的Animation時由重置導致的問題。

如果您希望旋轉的內容僅包含圖像,請考慮將圖像包裝在RotateDrawable中,並將其設置爲ImageView的內容。通過此設置,您可以通過設置其級別值(或者Drawable.setLevel()ImageView.setImageLevel()應該執行該操作)來控制繪圖旋轉的方式,並且轉換將繼續。如果您需要在一段時間內自動化動畫,則可以簡單地調用Handler中的級別設置代碼,以便每隔一段時間發佈一次更新。

另一種選擇是創建自定義ViewGroup並使用getChildStaticTransformation()方法將旋轉應用於任何子視圖(確保啓用它或覆蓋已啓用它的子類)。 Transformation也是Animation框架用來修改視圖外觀。在這種情況下,當用戶輸入更改以強制重新繪製時,您可能仍需要撥打invalidate()。如果您想定期自動執行更改,則會應用相同的Handler規則。

RotateDrawable例

比方說,你是想將圖像旋轉爲RES /繪製/ wheel.png,在創建資源一個簡單的XML文件/繪製/ wheel_rotate.xml:

<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/wheel" 
    android:fromDegrees="0" 
    android:toDegrees="360" 
    android:pivotX="50%" 
    android:pivotY="50%" /> 

將您的圖像打包成RotateDrawable。然後,在你的Java代碼組繪製作爲ImageView的內容:

ImageView wheel; 
//You only do this once 
wheel.setImageResource(R.drawable.wheel_rotate); 

//Adjust the progress any time you need to by adjusting the drawable's level 
wheel.setImageLevel(500); 

默認情況下,電平範圍從0到10000。因此,映射到0級= fromDegrees和10,000級= toDegrees。

HTH

+0

使用RotateDrawable似乎是一個很好的解決方案,但我似乎無法弄清楚如何以編程方式做到這一點。你能提供一個例子嗎? – 2012-01-15 18:13:17

+0

簡單的例子,應該給你所有你需要的鉤子。 – Devunwired 2012-01-15 22:36:01

+0

工作正常,謝謝! :) – 2012-01-16 17:09:23