如何使用计时器移动Canvas Shape

时间:2014-03-04 22:13:51

标签: android canvas timer

My Circle Class !!

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() 
        }
    }};

}

1 个答案:

答案 0 :(得分: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方法。