在循环中绘制到画布

时间:2013-03-19 09:50:08

标签: android android-canvas android-ui

在Eclipse IDE for Android中,我正在解决一个简单的问题。 我正在使用这样的代码:

public class Reader extends Activity 
{
    // declarations
    private class GraphView extends View 
    {
        protected void onDraw(Canvas canvas) 
        {
            synchronized(this)
            {
                final Paint paint = mPaint;
                // some drawings
                myvoid(canvas,paint);
                // some drawings
            }
        }
    }
    void myvoid(Canvas c,Paint p)
    {
        int i=0;
        do //or for cycle
        {
            i++;
            c.drawText(Integer.toString(i),0,100,p); // <<<<<<<<<<<<<<<< Problem
        }
        while (i<100000);
    }
}

在while循环结束之前,画布和文本不会更新。 看来,画布在那段时间内被“锁定”了。 我怎样才能实现,我可以在画布上看到循环内部的进展?

谢谢,托马斯。

3 个答案:

答案 0 :(得分:1)

问题是你没有给Android任何时间来呈现绘图方法的结果。您应绘制循环的一个步骤并调用invalidate以触发下一步。 Android将在屏幕上绘制您的文本,然后它将尝试再次使用增加的计数器重绘它。请比较您的代码和我的版本:

private class GraphView extends View {

    protected void onDraw(Canvas canvas) { // some drawings
        myvoid(canvas, paint);
        // some drawings
    }

    void myvoid(Canvas c, Paint p) {
        int i = 0;
        do // or for cycle
        {
            i++;
            c.drawText(Integer.toString(i), 0, 100, p);
        } while (i < 100000);
    }
}

我的版本包含invalidate():

private class GraphView extends View {
    int i = 0;
    Paint paint = new Paint();

    @Override
    public void draw(Canvas canvas) {
        canvas.drawText(Integer.toString(i), 0, 100, paint);
        i++;
        invalidate();
        super.draw(canvas);
    }
}

答案 1 :(得分:0)

我想你可以试试这个

imageView = (ImageView) this.findViewById(R.id.imageView1);

        Display currentDisplay = getWindowManager().getDefaultDisplay();
        @SuppressWarnings("deprecation")
        //float dw = currentDisplay.getWidth();
       // float dh = currentDisplay.getHeight();

        bitmap = Bitmap.createBitmap((int) dw, (int) dh,
            Bitmap.Config.ARGB_8888);
        canvas = new Canvas(bitmap);
        paint = new Paint();
        paint.setColor(Color.RED);
        imageView.setImageBitmap(bitmap);

您可以尝试将画布设为位图图像,然后将位图设置为imageview

答案 2 :(得分:0)

请按照以下步骤操作:

  • 在活动中设置视图
  • 启动辅助线程来完成您的流程
  • 线程中的
  • 使视图无效

这个例子可能会有所帮助:https://github.com/hamilton-lima/Bolinha/tree/master/src/com/example/bolinha