2014-03-04 56 views
0

我的圈子類!如何用計時器移動畫布形狀

public class Circle extends View{ 
int y =0 ; 


public line(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 
protected void onDraw(Canvas c){ 
    super.onDraw(c); 
    Paint p=new Paint(Paint.ANTI_ALIAS_FLAG); 
    p.setColor(Color.BLUE); 
    p.setStrokeWidth(3); 

    if (y==0){ 
     c.drawCircle(100,y+5,50,p); 
    } 
    else{ 
     c.drawCircle(100,y+5,50,p); 
    } 
} 
public void invalidate(){ 
    invalidate(); 
} 

和MainActivity !!

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    RelativeLayout rl=new RelativeLayout(this); 
    setContentView(rl); 
    rl.setBackgroundResource(R.drawable.ic_launcher); 
    Circle c=new Circle(this); 
    rl.addView(c); 
    Timer t=new Timer();//here is Where I need help 
    t.schedule(new MyNewTimer(),0,20);//here is Where I need help 
    } 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

}

我定時器想法從一些網站。我是Android編程的初學者。我真的不知道如何用計時器來移動這個形狀。其實,我不知道該把這個時間任務放在哪裏,以及在哪裏放置! 請好心幫助我!

我添加此上的onCreate()

Timer timer = new Timer(); 
timer.schedule(new MyTimer(),0,20); 

我創建MyTimer類

public class MyTimer extends TimerTask{ 
@Override 
public void run(){ 
    handler.post(new Runnable(){ 
     public void run(){ 
      //Here, I can't inherit circle.invalidate() 
     } 
    }}; 

} 
+0

你的用於'Circle'的'onDraw'方法有一個'if'語句,它不管'y'的值如何都繪製相同的東西;你應該解釋你想要完成的事情。而且,你的'invalidate()'方法會遞歸直到堆棧溢出。最後,你需要告訴我們'MyNewTimer'類是做什麼的。 –

+0

yess,yess。我之前創建了MyNewTimer類,但是我不能從circle類繼承y。 MyNewTimer需要invalidate()是靜態的,但通過改變它,在circle類中有一個錯誤,我不想修復它。請給我建議,以滿足正確的修復!非常感謝你Ted Hopp! –

+0

我在onCreate()上加上這個() Timer timer = new Timer(); timer.schedule(new MyTimer(),0,20); ,打造一流的MyTimer 公共類MyTimer擴展的TimerTask { \t @覆蓋 \t公共無效的run(){ \t \t handler.post(新的Runnable(){ \t \t \t公共無效的run(){ \t \t \t \t //我不能調用無效(),如何調用它 \t \t \t} \t \t}}; } –

回答

0

從後臺線程,你需要調用postInvalidate()View,而不是invalidate()(必須叫在UI線程上)。你也許可以做這樣的事情:

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     RelativeLayout rl=new RelativeLayout(this); 
     setContentView(rl); 
     rl.setBackgroundResource(R.drawable.ic_launcher); 
     final Circle c = new Circle(this); 
     rl.addView(c); 
     Timer t=new Timer(); 
     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       // update the y coordinate in c 
       . . . 
       // ask for the view to be redrawn 
       c.postInvalidate(); 
      } 
     }; 
     t.schedule(task, 0, 20); 
    } 
} 

注意c必須聲明在此代碼final,以便它可以從匿名TimerTask對象引用。如果您創建一個單獨的類(例如MyNewTimer),那麼您可以在構造函數中傳遞對c的引用,以便它可以訪問該視圖。

正如我在我的評論中指出的,您在Circle中遇到了其他問題。我首先刪除你寫的invalidate方法。

+0

謝謝,我正在嘗試! :) 非常感謝 ! –

+0

您的代碼已成功幫助您!非常感謝你給予你的時間和分享知識!我的圈子現在正在移動! :)謝謝! –