【问题标题】:switch between two surfaceView在两个surfaceView之间切换
【发布时间】:2013-10-08 07:24:49
【问题描述】:

我有两个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);
    }
}

【问题讨论】:

  • 感谢 Braj,它真的很有帮助。另一个问题,如果我想显示从TextureView生成的SurfaceTexture,我需要一个单例SurfaceView,对吗?并在 SurfaceView 中将所有像素从 SurfaceTexture 绘制到 Surface?如果 SurfaceTexture 的内容经常变化,复制像素的操作可能会消耗过多的 cpu。
  • 对不起。我对这一切都不太了解。

标签: android view surfaceview


【解决方案1】:

我想你可以在调用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);
    }

【讨论】:

  • 感谢您的即时回复! View.GONE 确实解决了我的问题,因为这两个 SurafceView 没有从视图层次结构中分离出来,是不是消耗太多了?事实上,在我的情况下,可能有 10 个或更多的表面视图。
  • 每个表面视图只有一个在 onCreate() 中创建的副本。切换状态的成本低于频繁添加和删除表面视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2018-04-13
  • 2016-04-14
  • 2015-10-18
相关资源
最近更新 更多