【问题标题】:How can I invalidate() a android.view.View every 16 ms?如何每 16 毫秒使 android.view.View 无效()?
【发布时间】:2023-03-16 13:45:01
【问题描述】:

我知道有很多这样的问题,但没有一个答案对我有用!

编辑 1:我想编写一个“乒乓”游戏。一个方法应该每帧重新计算和重新绘制球。

基本上我正在寻找另一种方法来执行此操作(每 16 毫秒更新一次视图以使游戏运行):

Thread t = new Thread(){
    while (true){
        try{
            Thread.sleep(16);
        } catch (InterruptedException e) {

        }
        invalidate();
    }
}
t.start(); //here the code crashes

我已经通过HandlerTimerTask (link) 和Runnable 列出了一些。

当我收到android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 时,我最好的尝试是:

Timer timer = new Timer();
final GameView v = this;
final TimerTask task = new TimerTask() {
    @Override
    public void run() {
        v.invalidate();
    }
};
timer.schedule(task, 100, 200);

编辑 2:m0skit0 的最佳方法:

Timer timer = new Timer();
final GameView v = this;
final TimerTask task = new TimerTask() {
    @Override
    public void run() {
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (!pause)
                    v.update(); //my invalidate()-method
            }
        });
    }
};
timer.schedule(task, 0, 16);

致所有有工作想法的人:提前谢谢!

【问题讨论】:

  • 你为什么首先要invalidate()View?为什么要每 16 毫秒执行一次? invalidate() 是一个相对昂贵的电话,而且通常不需要。
  • 您可以使用Activity#runOnUiThread() 拨打您的invalidate(),但您可能需要先回答CommonsWare 的评论。如果您正在制作游戏,请考虑使用Canvas
  • @CommonsWare 我使用来自ViewonDraw(Canvas c)-方法,那么我应该使用什么而不是invalidate() 来重绘?
  • 嗯,对于游戏,我会使用游戏开发框架或引擎,无论是 2D 还是 3D,而不是直接使用 View 系统。
  • @m0skit0 thx 这看起来不再漂亮了,但它终于可以工作了。即使是生涩的......

标签: android multithreading frames


【解决方案1】:

建议 1:
使用View.postInvalidate() 而不是View.invalidate()
这里是postInvalidate()description

public void postInvalidate()

导致在事件的后续循环中发生无效 环形。使用它来使来自非 UI 线程的视图无效。

只有在以下情况下才能从 UI 线程外部调用此方法 此视图附加到一个窗口。

建议 2:
游戏使用LIBGDX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多