Android 位图onDraw()未更新
我试图在视图上显示一个蓝色的正方形,然后显示一个红色的正方形 问题是当它应该画一个蓝色正方形时,它什么也不画,但当它应该画一个红色正方形时,它却不画一个蓝色正方形 我错过了什么Android 位图onDraw()未更新,android,draw,Android,Draw,我试图在视图上显示一个蓝色的正方形,然后显示一个红色的正方形 问题是当它应该画一个蓝色正方形时,它什么也不画,但当它应该画一个红色正方形时,它却不画一个蓝色正方形 我错过了什么 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(runCount == 1) { // Color blue and save bitmap blueCanvas
@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();
}
直接从文档中: 公开无效 使整个观点无效。如果视图可见,将来某个时候将调用onDrawandroid.graphics.Canvas 如前所述,您正在onDraw方法本身内部调用invalidate,因此它正在创建一个无限循环。同时,您也在更新其中的runCount,因此它会不断增加该变量 虽然我不确定你到底想做什么,但我建议至少删除这个声明
invalidate();
从onDraw方法内部重新思考您的设计。只要有此视图的引用,就可以从程序中的其他位置调用invalidate,但请确保调用在UI主线程上。如果要在画布上绘制位图,则需要将位图附加到画布上,然后尽可能快地绘制
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
将此存储库作为样板文件使用
您不需要调用invalidate;从onDraw方法。我也不明白你到底想做什么,请详细说明。我只是在阅读了一些关于画布、位图等的理论之后,试图了解这个机制是如何工作的。但是我不能理解这个小例子,最终解决方案应该会产生一条连续的线。我只是想了解它是如何更新位图的