我知道有很多类似的问题,但似乎没有一个答案适用,所以也许有人可以发现我做的不同。
在我的活动中,我启动了一个包含画布的弹出窗口,它应该绘制一个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
,它不会以某种方式清除或重置,对吧?