Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 位图onDraw()未更新_Android_Draw - Fatal编程技术网

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方法。我也不明白你到底想做什么,请详细说明。我只是在阅读了一些关于画布、位图等的理论之后,试图了解这个机制是如何工作的。但是我不能理解这个小例子,最终解决方案应该会产生一条连续的线。我只是想了解它是如何更新位图的