我正在制作一个需要动态动画的应用。 (玩家 Action )我正在使用 Canvas
对象来执行此操作。我的第一个问题是“Canvas
真的是处理这些动画的最佳方式吗?”,
我的第二个问题是“如何将玩家重新绘制到 Canvas
?”这是我的代码:
游戏.java:
package birdprograms.freezetag;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
public class theGame extends Activity {
players[] arr = {
new player(),
new player(),
new player(),
new player()
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new myView(this));
}
public class myView extends View {
Paint paint = new Paint();
public myView(Context context) {
super(context);
paint.setColor(Color.YELLOW);
}
@Override
public void onDraw(final Canvas canvas) {
arr[0].update(true, true);
arr[0].draw(canvas, paint);
}
}
}
播放器.java
package birdprograms.freezetag;
import android.graphics.*;
public class player {
int y = 0;
int x = 0;
int vy = 5;
int vx = 5;
int height = y + 15;
int width = x + 15;
public void draw(Canvas canvas, Paint paint){
canvas.drawRect(x,y,width,height,paint);
}
public void update(boolean left, boolean top){
if(left){x += vx; width = x + 15;}
else{x -= vx; width = x + 15;}
if(top){y += vy; height = y + 15;}
else{y -= vy; height = y + 15;}
}
}
最佳答案
您实际上无法控制何时调用 onDraw
:当 View 无效时,onDraw
将在将来的某个时间点被调用.
您的代码中存在一个基本的设计缺陷:玩家的位置在 onDraw
执行期间被修改:您将无法控制它。
每 5 秒移动一次玩家:您可以使用 Handler.postDelayed
每 5 秒重新发布相同的 Runnable
。 Runnable
将更新玩家位置,然后使 View 无效。
下面是一些代码来说明这个想法
(免责声明:这是伪代码,它只关心索引为 0 的玩家,移动所有玩家还有更多工作要做,...)
public class myView extends View {
Paint paint = new Paint();
public myView(Context context) {
super(context);
paint.setColor(Color.YELLOW);
movePlayer0Runnable.run(); //this is the initial call to draw player at index 0
}
@Override
public void onDraw(final Canvas canvas) {
super.onDraw(canvas); //IMPORTANT to draw the background
arr[0].draw(canvas, paint);
}
Handler handler = new Handler(Looper.getMainLooper());
Runnable movePlayer0Runnable = new Runnable(){
public void run(){
arr[0].update(true, true);
invalidate(); //will trigger the onDraw
handler.postDelayed(this,5000); //in 5 sec player0 will move again
}
}
...
}
关于java - 如何使android Canvas 每5秒重新绘制一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27388569/