Android视图:强制执行onDraw()并等待其完成

3

我有一个视图,想要在每次新的line对象存储到我的lines数组中时更新它。这发生在drawLine()函数中。因此,drawYourselfe()函数应该以某种方式强制onDraw(),并等待它完成。这是我的代码的一部分。有人能告诉我drawYourselfe()应该是什么样子吗?

public class MyView extends View{

    private ArrayList<Line> lines;
    private Paint paint; //created in constructor

    protected void drawLine(float[] f)
    {
        if(f.length != 5)
        {

        } else {
            lines.add(new Line(f));
            Log.d("SuM","added Line");
            if(!bufferedDrawing) // in this example bufferedDrawing=false because i want to update the View on every new Line;
            {
                drawYourselfe();
            }

        }
    }

    protected void onDraw(Canvas canvas) {
        Log.d("SuM","onDraw");

        for(Line l : lines)
        {
            l.analysis(); //Logs fromX,toX,fromY,toY and color to console

            paint.setColor(l.getColor());
            canvas.drawLine(l.getFromX(),l.getFromY(),l.getToX(),l.getToY(), paint);

        } 

    }

    public void drawYourselfe()
    {
        //When this is called, onDraw should be called and the Thread should wait till its done;
    }

}  

编辑说明: 我最好提一下我想做什么以及为什么简单地无效()不起作用:在我的MainActivity中,我调用

myView.drawLine(line1);
myView.drawLine(line2);
myView.drawLine(line3);
//and so on...

我希望能够看到这些线条是一个接一个地绘制出来的。在drawYourselfe()中调用invalidate()时,我只看到所有线条都被绘制出来了,而不是一个接一个地绘制出来。我知道这三条线被绘制得非常快,以至于我无法逐个观察它们的绘制过程,但在我的应用程序中,我需要处理成千上万条线。


绘图是非常快速的操作,肉眼无法察觉...我认为人眼只能识别每秒16帧(但我不确定)... - Gopal Gopi
嗯,我用这个图形化地实现了汉诺塔问题,这确实是一个耗时很长的过程,取决于我的盘子数量。我总是在大约20秒后看到它们被解决,但不知道这些盘子是如何移动的。 - Eric
3个回答

1

调用invalidate(),但无法等待绘制完成。draw将在您的drawLine调用返回后稍后调用。


0
请在添加新行时调用invalidate()函数。 invalidate将调用onDraw函数。

1
理论上是这样的,但对我来说并不起作用。据我所知,invalidate只是向UIThread添加一个请求以获取更新。这意味着它不会立即更新。当我在时间线中添加更多行时,视图没有更新,Android决定跳过帧或类似的操作。结果是我没有得到一种动画效果,可以看到新线条的绘制,而只有所有线条都被绘制出来的最终图片。 - Eric

0
调用View.invalidate()来强制View重新绘制其内容,由于这里只有一个Thread,它将等待绘制完成,即下一条指令将不会执行,直到onDraw()完成...

1
错误。从文档来看:使整个视图无效。如果该视图可见,则onDraw(android.graphics.Canvas) 将在未来的某个时间点被调用 - jiulongw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接