Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.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 View.onDraw()始终具有干净的画布_Android_Android Canvas_Android Ui - Fatal编程技术网

Android View.onDraw()始终具有干净的画布

Android View.onDraw()始终具有干净的画布,android,android-canvas,android-ui,Android,Android Canvas,Android Ui,我想画一个动画。为此,我扩展了视图并重写了onDraw()方法。我所期望的是,每次调用onDraw()时,画布都会处于我将其保留的状态,我可以选择清除它或只是绘制它的一部分(这是我使用SurfaceView时的工作方式),但每次画布返回时都已经清除。有什么办法我不能把它清除掉吗?或者可以将以前的状态保存到位图中,这样我就可以绘制该位图,然后在其上方绘制?您应该看看基本视图和surfaceView之间的区别。surfaceView有一个用于绘制的专用图层,我想它可以跟踪您以前绘制的内容。现在,如果

我想画一个动画。为此,我扩展了视图并重写了onDraw()方法。我所期望的是,每次调用onDraw()时,画布都会处于我将其保留的状态,我可以选择清除它或只是绘制它的一部分(这是我使用SurfaceView时的工作方式),但每次画布返回时都已经清除。有什么办法我不能把它清除掉吗?或者可以将以前的状态保存到位图中,这样我就可以绘制该位图,然后在其上方绘制?

您应该看看基本视图和surfaceView之间的区别。surfaceView有一个用于绘制的专用图层,我想它可以跟踪您以前绘制的内容。现在,如果您真的想在基本视图上执行此操作,您可以尝试将绘制的每个项目放入一个数组中,如的示例。
它应该以几乎相同的方式工作

我不确定是否有办法。但是对于我的自定义视图,我要么在每次调用onDraw()时重新绘制所有内容,要么绘制位图,然后将位图绘制到画布上(就像您在问题中建议的那样)

我是这样做的

class A extends View {

    private Canvas canvas;
    private Bitmap bitmap;

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if (bitmap != null) {
            bitmap .recycle();
        }
        canvas= new Canvas();
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvas.setBitmap(bitmap);
    }
    public void destroy() {
        if (bitmap != null) {
            bitmap.recycle();
        }
    }
    public void onDraw(Canvas c) {
      //draw onto the canvas if needed (maybe only the parts of animation that changed)
      canvas.drawRect(0,0,10,10,paint);

      //draw the bitmap to the real canvas c
      c.drawBitmap(bitmap, 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
    }
}

你的期望与现实不符:)画布不会是你留下的样子,而是空白的。可以创建要绘制的对象的ArrayList(canvas.drawCircle()、canvas.drawBitmap()等),然后在OnDraw()中迭代ArrayList。我是图形编程新手,但我在小范围内使用过它。也许有更好的方法。

我看到了那页。事实上,该页面最初让我使用了SurfaceView,但后来我发现SurfaceView不能有透明的背景。我需要这个小部件能够放在其他视图之上。然后试试drawable的数组?在现代Android中,如果你想使用OpenGL,你可以使用纹理视图。我刚才就知道了!谢谢你的意见!绘制到缓冲区效果很好,但是这个巨大的drawBitmap()方法消耗了大量的FPS:(现在对我来说是一个瓶颈-每次在onDraw中绘制全屏位图以恢复以前的状态几乎不会影响高分辨率设备的FPS(如Kindle 8.9第三代2560x1600)。是否真的没有办法强制画布保持其以前的状态?深入到OpenGL可能会解决性能问题,但到目前为止,这不是解决性能问题的方法。如果您创建画布,则会解决性能问题。这样,您就可以完全控制绘制到画布上的内容。而不是Arraylist:您可以使用Picture类记录绘图调用。