2013-03-19 77 views
0

我想弄清楚在android中从屏幕顶部向下移动一个矩形的最佳方式,因为即时尝试做一个俄罗斯方块克隆,但我无法弄清楚为什么android不像定时器。所以,如果你们可以帮我找出从这个矩形上下移动这个矩形的最佳方式,那将是非常难的在Android中移动一个形状

在这段代码中我创建了一个矩形出现的游戏屏幕,但是当我尝试用定时器移动它时它不工作

package 
com.example.coloroblind; 

import java.util.Timer; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.net.wifi.p2p.WifiP2pManager.ActionListener; 
import android.os.Bundle; 
import android.view.View; 

public class GameView extends Activity { 

    int x=20,y=20,changeX=2,changeY=2; 
    boolean reverseX=false,reverseY=false; 

    @Override public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.game); 
     setContentView(new DrawView(this)); 
    } 

    public class DrawView extends View{ 

     public DrawView(Context context){ 
      super(context); 


     } 
     Timer timer = new Timer(10,new TimerListener()); 
     timer.start(); 


    @Override public void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 

     //fill the screen with white 
     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     canvas.drawColor(Color.WHITE); 

     //draw a rect 
     paint.setColor(Color.GREEN); 

     RectF rect = new RectF(x,y,50,50); 

     canvas.drawRoundRect(rect, 6, 6, paint); 

     int start = ((int)Math.random())*4; 



     x+=changeX; 
     y+=changeY; 
     if(y>getHeight()){ 
     changeY=-1*changeY; 
     reverseY=true; 
     } 
     if((reverseY==true)&&(y<0)){ 
     reverseY=false; 
     changeY=-1*changeY; 
     } 
     if(x>getWidth()){ 
     changeX=-1*(changeX); 
     reverseX=true; 
     } 
     if((reverseX==true)&&(x<0)){ 
     changeX=-1*(changeX); 
     reverseX=false; 
     } 

    } 
     class TimerListener implements ActionListener{ 
      public void actionPerformed(ActionEvent e){ 
      repaint(); 

      } 

     @Override 
     public void onFailure(int arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onSuccess() { 
      // TODO Auto-generated method stub 

     } 

     } 

} 
} 
+0

改变x和y的计时器并调用无效()进行更改后。 – Raghunandan 2013-03-19 05:55:35

回答

0

您使用Timer的方式不适用于Android。有没有像Timer(10,new TimerListener())

没有这样的构造函数使用定时器是在下面的代码段的最快方法:

Timer t = new Timer(); 
t.schedule(new TimerTask() { 
    @Override 
    public void run() { 

    } 
}, _delay, _period); 
+0

所以我将如何实现这一点,因为我试图在DrawView中超级(上下文)后输入这个权利,我没有看到我的广场移动,我不知道我做错了什么。 – user1917755 2013-03-20 16:02:04

+0

您应该将计时器代码放置在构造函数中。计时器应该随时间改变坐标。在你的onDraw()中,你绘制了在定时器中设置坐标的对象。 – Krypton 2013-03-21 01:46:02

+0

在我的计时器中,我将它设置为Timer t = new Timer(); \t \t \t \t t.schedule(新的TimerTask(){ \t \t @Override \t \t公共无效的run(){ \t \t \t \t } \t \t } \t,10,3);这是在构造函数GameView和IM画一个矩形,所以我有RetF rect = new RectF(20,20,50,50);所以你说我应该改变rect是RectF rect = new RectF(10,3,50,50)那样? – user1917755 2013-03-27 22:06:53