java - 如何使android Canvas 每5秒重新绘制一次

标签 java android android-canvas

我正在制作一个需要动态动画的应用。 (玩家 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 秒重新发布相同的 RunnableRunnable 将更新玩家位置,然后使 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/

相关文章:

java - 使用正则表达式将嵌套字符与其含义相匹配

java - 想要在 Imagebutton 单击时创建 NavigationDrawer

android - setFragmentResult 在单击监听器上不起作用

android - 如何使用 matrix.preScale(x,y)

java - Canvas 坐标不准确地显示我的位图

Android:用手指触摸在ImageView上绘制文本

java - 检查列表是否包含相同的对象

java - 使用spring并在CXF中生成服务器和客户端

java - 无法在Spring Boot中实现Drools KieSession持久化

android - 如何使用 Android SQLite 数据库在 iOS 中填充 CoreData?