【问题标题】:how to call the onDraw method of a SurfaceView using a thread class如何使用线程类调用 SurfaceView 的 onDraw 方法
【发布时间】:2013-08-24 07:18:55
【问题描述】:

所以我一直试图弄清楚如何将形状和图像绘制到表面视图。 iv 一直在使用多个教程。但现在我迷路了。我有一个线程,它有我的游戏循环,据我所知,我在这个循环中有所有变量更新

public void run() {
    Canvas c;
    while (running) {
         c = null;
         try {
             c = surfaceHolder.lockCanvas(null);
             synchronized (surfaceHolder) {
              //Insert methods to modify positions of items in onDraw()
             }
         } finally {
             if (c != null) {
                 surfaceHolder.unlockCanvasAndPost(c);
             }
         }
    }

}

我有一个具有 onDraw(Canvas canvas) 方法的surfaceView。假设我想在我的屏幕上添加椭圆我如何从我的线程中的 while 循环中做到这一点

我目前在我的线程类中有这些变量

private SurfaceHolder surfaceHolder;
private gameMain gamePanel; //my surfaceview class
private boolean running;

我需要在我的surfaceview类中使用它吗?

setWillNotDraw(false);

如果我做错了,人们会指出来。我不想使用 openGL 或任何库

【问题讨论】:

    标签: java android multithreading android-canvas surfaceview


    【解决方案1】:

    所以我对这个问题给出的解决方案是改变它所说的:

    try {
        c = view.getHolder().lockCanvas();
        synchronized (view.getHolder()) {
            view.onDraw(c);
        }
        } finally {
            if (c != null) {
               view.getHolder().unlockCanvasAndPost(c);
            }
    }
    

    关于 GameLoopThread 类的 run() 方法:

    try {
        c = view.getHolder().lockCanvas();
        synchronized (view.getHolder()) {
            if(c != null)
                view.onDraw(c);
        }
        } finally {
            if (c != null) {
               view.getHolder().unlockCanvasAndPost(c);
            }
    }
    

    为了完成这个活动并调用另一个活动,我添加了一个名为 GameOver 的方法,效果很好:

    private void GameOver() {
        gameLoopThread.setRunning(false);
        Context c = getContext();
        c.startActivity(intent); //intent must be declared
        ((Activity) Pruebas.this.getContext()).finish();
    }
    

    我希望这对某人有所帮助。

    【讨论】:

    • onDraw 正在调用可疑的方法。还是可以用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多