即使多次调用invalidate,onDraw也只调用一次

时间:2018-01-18 02:42:40

标签: android canvas ondraw invalidation

我知道有很多类似的问题,但似乎没有一个答案适用,所以也许有人可以发现我做的不同。

在我的活动中,我启动了一个包含画布的弹出窗口,它应该绘制一个3条形图表。如果我在onDraw中执行3行,就可以了:

        c.drawRect(160, 60, 800, 110, myPaint);
        c.drawRect(160, 160, 250, 210, myPaint);
        c.drawRect(160, 260, 400, 310, myPaint);

但是我想对它进行参数化,并在我的活动中从for循环中多次调用它。问题是只显示最后一个条,当我通过调试器运行或通过logcat检查时,我看到'setBar'(具有invalidate()调用)执行了3次,但仅onDraw最后一次。'

我将setWillNotDraw添加到false,这是其他帖子的主要解决方案。这是我调用弹出窗口的活动的片段:

                statsDrawCanvas = (StatsDrawCanvas) popupView.findViewById(R.id.statsCanvasDraw);

                for (int day = 0; day <3; day ++) {

                    BarTop = BarTop + 100;
                    BarBottom = BarBottom + 100;

                    statsDrawCanvas.setBar(BarLeft, BarTop, BarRight, BarBottom);
                }

这是我的canvas类代码段:

    public StatsDrawCanvas(Context context) {

        super(context);

        brush.setStyle(Paint.Style.STROKE);
        brush.setStrokeWidth(20);

        setWillNotDraw(false);
    }

    public StatsDrawCanvas(Context context, AttributeSet attrs) {

        super(context,attrs);

        brush.setStyle(Paint.Style.STROKE);
        brush.setStrokeWidth(20);

        setWillNotDraw(false);
    }

    @Override
    protected void onDraw(Canvas c) {

        Log.i("LOG: (DRAW) ", "--- onDraw");

        CanvasWidth = c.getWidth();
        CanvasHeight = c.getHeight();

        Paint myPaint = new Paint();
        myPaint.setStyle(Paint.Style.FILL);
        myPaint.setColor(getResources().getColor(R.color.colorTeal1));
        myPaint.setStrokeWidth(10);

//        c.drawRect(160, 60, 800, 110, myPaint);
//        c.drawRect(160, 160, 250, 210, myPaint);
//        c.drawRect(160, 260, 400, 310, myPaint);

        c.drawRect(barCoordLeft, barCoordTop, barCoordRight, barCoordBottom, myPaint);

    }

//**********************************************************************************************
    //***   Method: Set Bar Data
    //**********************************************************************************************
    public void setBar(int left, int top, int right, int bottom) {

        barCoordLeft = left;
        barCoordTop = top;
        barCoordRight = right;
        barCoordBottom = bottom;

        Log.i("LOG: (DRAW) ", "--- setBar");

        invalidate();
    }

我误解了onDraw的工作原理吗?我想画一个带有轻微偏移的x次,并为它添加更多文本(稍后)。这应该工作,即逐步调用onDraw,它不会以某种方式清除或重置,对吧?

0 个答案:

没有答案