【问题标题】:How to control the Android SurfaceView (canvas) redraw如何控制Android SurfaceView(canvas)重绘
【发布时间】:2013-06-17 23:17:01
【问题描述】:

我在一个网格中有几张图片。 看起来像这样: [http://cdn.thenextweb.com/wp-content/blogs.dir/1/files/2013/06/jolla4.jpg][1]

我没有使用 android Gridview,而是使用了画布,因为需要对图标进行动画处理。我读到我需要将画布用于游戏。

我正在使用 SurfaceView(结合线程)在屏幕上绘制图像。

 class MySurface extends SurfaceView implements SurfaceHolder.Callback {
@Override
    public void onDraw(Canvas canvas) {
        //here i create the bitmaps and draw the icons on the screen.

}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    thread.setRunning(false);
    while (retry) {
        try {
            thread.join();
            retry = false;
        } catch (InterruptedException e) {}
        }
    }

这一切都很好。在我的主要活动中使用代码调用 Mysurface:

setContentView(new MySurface());

问题是surfaceview的画布是随机重绘的。我想这样做,这样我就可以决定何时重绘画布以及重绘多少次。如何从主要活动中调用 onDraw 函数?我不知道该怎么做。

我知道在线程中已经完成了

mySurface.onDraw(c);

【问题讨论】:

    标签: android android-canvas surfaceview redraw


    【解决方案1】:

    onDraw 在每次屏幕刷新时被调用。屏幕刷新率取决于您的设备。如果刷新率为 70,那么您的 onDraw 每秒调用 70 次。 onDraw 在单独的线程上运行,因此我不建议通过尝试从您的 UI 线程调用它来搞乱它。计算增量时间,即自上次调用 onDraw 以来经过的时间。假设您想以每秒 50 像素的速度为位图设置动画,然后说 x += 增量时间 * 50;

    这将使您的位图每秒在 x 轴上仅移动 50 像素。

    如果你只是说 x += 1;

    您的位图将每秒移动屏幕刷新率次数。由于所有设备都有不同的刷新率,因此您需要使用增量时间才能在所有设备中以相同的速度更新屏幕。否则,您的动画速度会因设备而异。

    【讨论】:

    • 我看到还有invalidate()。这是一种重绘视图的方法。 “这必须从 UI 线程中调用。”
    • invalidate 在 onDraw 中被调用来告诉 onDraw 应该被再次调用。由 SurfaceView 创建的线程调用。
    猜你喜欢
    • 2016-07-15
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多