如何从异步任务在画布上绘图?

时间:2016-09-04 18:55:22

标签: android canvas

我有一个名为RectLine的类,它从AsyncTask扩展而来。 在MainActivity类中,在方法onDraw(Canvas canvas)中创建了RectLinel1)对象。我还传递了绘制所需的Canvas和Paint对象的引用。但是,当我调用l1.execute()方法时,屏幕上看不到任何内容。 我只能看到我在doInBackground方法上打印的日志信息,因此我确信代码执行得很好。 但设备屏幕上没有任何内容。

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(Color.parseColor("#CD5C5C"));


        //new LineaRecta(x1, y1, x2, y2, b)
        LineaRecta l1 = new LineaRecta(0, getHeight(), getWidth(), 0, getHeight());

        LineaRecta l1 = new LineaRecta( 0, getHeight(), getWidth(), 0, getHeight());
        l1.setAnchoCanvas(getWidth());
        l1.setCanva(canvas);
        l1.setPaint(paint);
        l1.execute();
    }

 @Override
protected Void doInBackground(Void... voids) {
    float y;        
    for(float x=0; x<anchoCanvas;x++){
        y=(m*x)+b;
        canvas.drawCircle(x, y, Punto.RADIO, paint);                      
    }
    return null;
} 

我的猜测是,我不能直接从后台线程画在画布上。

这是对的吗? 有什么更好的方法呢?

3 个答案:

答案 0 :(得分:3)

要在后台的mainUI线程中执行某些操作,请使用此包装器:

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                //do something
            }
        });

重绘您的视图使用此代码:

myview.invalidate();&lt; - 此方法调用您视图的onDraw()

答案 1 :(得分:0)

我认为您无法在doInBackground(Void... voids)中使用以下行:

 canvas.drawCircle(p.getX(), p.getY(), Punto.RADIO, paint); 

为了实现您的目标,您可以通过在doInBackground方法中调用publishProgress()以下方法来调用UI线程,同时后台计算仍在运行。

答案 2 :(得分:0)

是的,要重新绘制您的视图,请使用以下代码:

myview.invalidate(); &lt; - 此方法调用视图的onDraw()。

paoladelloglio.54