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
有三个缓冲区吗?
答案 0 :(得分:0)
无法判断SurfaceView正在使用多少缓冲区。即使你通过实验确定它,也可以从你的下方改变。
一般来说,如果以适度的速度发送SurfaceView缓冲区(可能使用Choreographer),它将是双缓冲的。如果你快速发送缓冲区,它将切换到三缓冲。其原因在graphics architecture doc。
中进行了解释但是,您可以合理地假设将有多个缓冲区,并且以前的内容不会被删除。因此,您需要绘制脏区域内的每个像素,默认为整个屏幕。