Android 在两个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

我有两个surfaceView,一次只将其中一个添加到视图层次结构中,另一个被删除,我的问题是,当添加surfaceView时,有一个即时黑色矩形覆盖它,我可以避免吗

以下是测试代码:

 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的成本。