2012-08-10 126 views
2

我是新來的android,並且在理解如何動畫畫布時遇到問題。 基本上我畫了一個紅色的球和一個樓梯,當球從樓梯上掉落時在Android中創建畫布動畫

這裏是它的樣子。

enter image description here

誰能幫助我,我應該用什麼方法?如果你能提供給我一個非常有用的源代碼。

這裏是我的源代碼:

DrawingView.java

package com.ballandstair; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.view.View; 

public class DrawingView extends View { 
    DrawingView(Context context) { 
     super(context); 
    } 

    protected void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     Paint paint = new Paint(); 
     Path path = new Path(); 

     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.RED); 
     paint.setAntiAlias(true); 
     canvas.drawCircle(100, 50, 25, paint); 

     paint.setColor(Color.BLUE); 
     paint.setStyle(Paint.Style.FILL); 
     path.moveTo(75, 75); 
     path.lineTo(125, 75); 
     path.lineTo(125, 125); 
     path.lineTo(175, 125); 
     path.lineTo(175, 175); 
     path.lineTo(225, 175); 
     path.lineTo(225, 225); 
     path.lineTo(275, 225); 
     path.lineTo(275, 275); 
     path.lineTo(325, 275); 
     path.lineTo(325, 325); 
     path.lineTo(75, 325); 
     path.close(); 
     canvas.drawPath(path, paint); 

    } 
} 

MainActivity.java

package com.ballandstair; 

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     DrawingView drawing = new DrawingView(this); 
     setContentView(drawing); 


    } 
} 

回答

0

您需要做的(至少)兩件事:

  1. 修改代碼,使球的位置是可變的。這不應該太難。
  2. 有更新定義球位置的變量的方法,並觸發自定義視圖的重畫,以便隨着時間的推移球出現跟隨你想要的路徑。

第二步需要小心一點。您可能會試圖編寫一個調用Thread.sleep(frameRate)(其中frameRate是幀之間的毫秒數)的循環,更新球位置,然後調用invalidate()爲您的自定義視圖觸發重繪。問題在於你無法暫停事件線程。有兩種處理方法(再次):

  1. 創建一個具有動畫循環的工作線程。它不能直接呼叫invalidate(),但它可以調用postInvalidate()達到同樣的效果。
  2. 聲明一個Runnable在其run()方法更新球的位置,來電invalidate(),然後問到的frameRate延遲一段時間後再次運行Runnable本身的看法(通過調用postDelayed())。

這兩種方法是合理的做法。您還需要邏輯來了解動畫何時應該結束,並且您可能想要讓用戶控制它何時啓動或允許重播。

1

基本上任何動畫邏輯是由3個部分組成:

  • 參數:要繪製的對象的位置,旋轉和比例;

  • 線程:您可以選擇使用2個線程單獨繪製和更新對象屬性(位置,旋轉和縮放)或在一個線程中執行它們。

  • 無限循環:一個循環,它借鑑 - >更新 - >繪製...無限

有很多種方式來實現它們,我只能建議一些API,你可以使用:

  • View.invalidate(),使用它來請求框架來重繪您的視圖,因此您的onDraw()方法將被調用。

  • [View.postDelayed()](http://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable,long)),使用它來使無限在你的onDraw()方法的最後循環調用View.invalidate()。