Android 在两个surfaceView之间切换
我有两个surfaceView,一次只将其中一个添加到视图层次结构中,另一个被删除,我的问题是,当添加surfaceView时,有一个即时黑色矩形覆盖它,我可以避免吗 以下是测试代码:Android 在两个surfaceView之间切换,android,view,surfaceview,Android,View,Surfaceview,我有两个surfaceView,一次只将其中一个添加到视图层次结构中,另一个被删除,我的问题是,当添加surfaceView时,有一个即时黑色矩形覆盖它,我可以避免吗 以下是测试代码: public class MainActivity extends Activity { private SurfaceView mSurfaceView; private SurfaceView mSurfaceView1; private SurfaceHolder.Callb
public class MainActivity extends Activity {
private SurfaceView mSurfaceView;
private SurfaceView mSurfaceView1;
private SurfaceHolder.Callback mSurfaceCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rv = this.getWindow().getDecorView();
final FrameLayout frameLayout = (FrameLayout) this.getWindow().getDecorView()
.findViewById(android.R.id.content);
final LinearLayout ll = new LinearLayout(this);
mSurfaceView = new SurfaceView(this);
mSurfaceView1= new SurfaceView(this);
mSurfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = null;
try
{
c = holder.lockCanvas();
c.drawColor(Color.GREEN);
Paint p = new Paint();
p.setColor(Color.WHITE);
Rect r = new Rect(100, 50, 300, 250);
c.drawRect(r, p);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null)
{
holder.unlockCanvasAndPost(c);
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
};
mSurfaceView.getHolder().addCallback(mSurfaceCallback);
mSurfaceView1.getHolder().addCallback(mSurfaceCallback);
Button b = new Button(this);b.setText("view1");
Button c = new Button(this);c.setText("view2");
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try{
ll.addView(mSurfaceView);
ll.removeView(mSurfaceView1);
}catch(Exception e) {}
}
});
c.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try{
ll.addView(mSurfaceView1);
ll.removeView(mSurfaceView);
}catch(Exception e) {}
}
});
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(b, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ll.addView(c, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
frameLayout.addView(ll);
}
}
我认为您可以在调用
onCreate
时添加这两个SurfaceView,并在onClick
中切换它们的状态。像这样:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rv = this.getWindow().getDecorView();
final FrameLayout frameLayout = (FrameLayout) this.getWindow().getDecorView()
.findViewById(android.R.id.content);
final LinearLayout ll = new LinearLayout(this);
mSurfaceView = new SurfaceView(this);
mSurfaceView1= new SurfaceView(this);
mSurfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = null;
try
{
c = holder.lockCanvas();
c.drawColor(Color.GREEN);
Paint p = new Paint();
p.setColor(Color.WHITE);
Rect r = new Rect(100, 50, 300, 250);
c.drawRect(r, p);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null)
{
holder.unlockCanvasAndPost(c);
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
};
mSurfaceView.getHolder().addCallback(mSurfaceCallback);
mSurfaceView1.getHolder().addCallback(mSurfaceCallback);
Button b = new Button(this);b.setText("view1");
Button c = new Button(this);c.setText("view2");
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try{
// ll.addView(mSurfaceView);
// ll.removeView(mSurfaceView1);
mSurfaceView.setVisibility(View.VISIBLE);
mSurfaceView1.setVisibility(View.INVISIBLE);
}catch(Exception e) {}
}
});
c.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try{
// ll.addView(mSurfaceView1);
// ll.removeView(mSurfaceView);
mSurfaceView1.setVisibility(View.VISIBLE);
mSurfaceView.setVisibility(View.INVISIBLE);
}catch(Exception e) {}
}
});
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(b, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ll.addView(c, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
// add mSurfaceView & mSurfaceView1
ll.addView(mSurfaceView);
ll.addView(mSurfaceView1);
mSurfaceView.setVisibility(View.INVISIBLE);
mSurfaceView1.setVisibility(View.INVISIBLE);
frameLayout.addView(ll);
}
选择TextureView以避免眨眼谢谢Braj,它真的很有帮助。另一个问题,如果我想显示从TextureView生成的SurfaceTexture,我需要一个singleton SurfaceView,对吗?并在SurfaceView中绘制从SurfaceTexture到曲面的所有像素?如果SurfaceTexture的内容经常更改,复制像素操作可能会消耗太多cpu。抱歉。我不太清楚。谢谢你的及时回复!View.GONE解决了我的问题,因为这两个SurafceView没有脱离视图层次结构,是不是消耗太多?事实上,在我的情况下,可能有10个或更多的surfaceview。每个surfaceview只有一个副本,它是在onCreate()中创建的。切换状态的成本低于频繁添加和删除surfaceview的成本。