SurfaceView有两个缓冲区?

时间:2016-02-23 07:43:33

标签: android canvas surfaceview

android官方说:"在每次传递中,您从SurfaceHolder检索Canvas,将保留Canvas的先前状态。为了正确地为图形设置动画,必须重新绘制整个表面。例如,您可以通过使用drawColor()填充颜色或使用drawBitmap()设置背景图像来清除“画布”的上一个状态。否则,您将看到之前执行的绘图的痕迹。"

然后我编写了一些代码来验证两个缓冲区。代码如下:

 public class MainActivity extends Activity {

    private SurfaceView iv;
    private int flag=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv=(SurfaceView) findViewById(R.id.sv);

    }
    public void draw(View view){

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub



                Paint paint=new Paint();

                SurfaceHolder holder1 = iv.getHolder();

                RectF r=new RectF(300,300,600,600);
                switch(flag){
                case 0: {Canvas canvas=holder1.lockCanvas();
                        canvas.drawColor(Color.RED);
                        holder1.unlockCanvasAndPost(canvas);
                        Log.d("ddd",flag+"");
                        flag++;}
                        break;
                case 1:
                    {Canvas canvas=holder1.lockCanvas();
                    canvas.drawColor(Color.BLUE);
                    holder1.unlockCanvasAndPost(canvas);
                    Log.d("ddd",flag+"");
                    flag++;}
                    break;
                case 2:
                {
                    Canvas canvas=holder1.lockCanvas();
                    holder1.unlockCanvasAndPost(canvas);
                    Log.d("ddd",flag+"");
                }
                    break;
                }
            }
        }).start();
    }
    }

xml文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="划线"
        android:onClick="draw"/>
    <SurfaceView android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/sv"/>

</LinearLayout>

如果SurfaceView有两个缓冲区,那么当flag==2时,前缓冲区是蓝色而后面的缓冲区是红色的。所以当我点击按钮时SurfaceView将改变它红色和蓝色之间的颜色。但事实是SurfaceView在红色,蓝色和黑色之间改变颜色(默认情况下SurfaceView's背景颜色为黑色)。SurfaceView有三个缓冲区吗?

1 个答案:

答案 0 :(得分:0)

无法判断SurfaceView正在使用多少缓冲区。即使你通过实验确定它,也可以从你的下方改变。

一般来说,如果以适度的速度发送SurfaceView缓冲区(可能使用Choreographer),它将是双缓冲的。如果你快速发送缓冲区,它将切换到三缓冲。其原因在graphics architecture doc

中进行了解释

但是,您可以合理地假设将有多个缓冲区,并且以前的内容不会被删除。因此,您需要绘制脏区域内的每个像素,默认为整个屏幕。