我试图在视图上显示一个蓝色正方形,然后在之后显示一个红色正方形。
问题在于,当它应该绘制一个蓝色正方形时,它没有绘制任何东西,但是当它应该绘制一个红色正方形时,它没有绘制任何蓝色正方形。
我在这里想念什么?
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(runCount == 1)
{
// Color blue and save bitmap
blueCanvas = new Canvas();
blueBitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Bitmap.Config.RGB_565);
canvas.drawRect(0, 0 , 200, 300, bgPaintBlue);
}
if(runCount == 2){
// Color red
redCanvas = new Canvas();
redBitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Bitmap.Config.RGB_565);
canvas.drawRect(0, 0 , 200, 300, bgPaintRed);
}
runCount++;
invalidate();
}
答案 0 :(得分:1)
直接从文档中获取
:公共无效无效()
使整个视图无效。如果该视图可见,则将来会在某个时候调用onDraw(android.graphics.Canvas)。
https://developer.android.com/reference/android/view/View.html#invalidate()
如前所述,您在onDraw方法本身内部调用了invalidate,因此它创建了一个无限循环。同时,您也在其中更新runCount,因此它会不断增加该变量。
尽管我不确定您到底想做什么,但我建议至少删除该语句
invalidate();
从onDraw方法内部重新思考您的设计。只要引用了该视图,就可以从程序的其他位置调用无效,但是请确保该调用位于UI(主)线程上。
答案 1 :(得分:0)
如果要在画布上绘制位图,则需要将位图附加到画布上,然后根据需要快速绘制。
private Bitmap canvasBitMap = null;
private Canvas bitmapCanvas = null;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int paddingLeft = getPaddingLeft();
int paddingTop = getPaddingTop();
int paddingRight = getPaddingRight();
int paddingBottom = getPaddingBottom();
int contentWidth = getWidth() - paddingLeft - paddingRight;
int contentHeight = getHeight() - paddingTop - paddingBottom;
mgraphWidth = contentWidth;
mgraphHeight = contentHeight;
if(canvasBitMap == null)
canvasBitMap = Bitmap.createBitmap(mgraphWidth, mgraphHeight, Bitmap.Config.ARGB_8888);
if(bitmapCanvas == null)
bitmapCanvas = new Canvas(canvasBitMap);
canvas.drawBitmap(canvasBitMap,0,0,mgraphcolor);
drawGraph(bitmapCanvas);
}
您可以使用此完整的GitHub代码通过CustomView了解图形/ UI绘图。
分叉此存储库并将其用作样板。