通过约束布局动态更改横竖屏切换后View视图变动

最近在项目中开发视频会议模块总结一下遇到的问题,

  1. 每个用户的流控和视图SurfaceView一一绑定的,所以切换C位视图的时候需要动态的切换View视图以及数据。
  2. 横竖屏切换的时候,view不能被销毁,需要配置configChanges ="orientation | screenSize",然后在onConfigurationChanged方法里做处理。
  3. 还有就是横竖屏切换的时候,横屏布局和竖屏布局UI位置变化了,用两套布局的话需要重新setContentView,但是用户一一绑定的SurfaceView,set的话会导致黑帧无法加载视频,所以需要保证在所有view是不变、是同一个的前提下来切换屏幕。

今天主要通过Android的约束布局ConstraintLayout来实现该功能。

在屏幕旋转之后onConfigurationChanged方法中判断当前是横屏还是竖屏,然后约束不同的位置:

  • 首先,我们通过ConstraintSet对象将xml里面的子控件(属性)先clone下来;
  • 其次,clear掉view原有的约束;
  • 然后,重新约束它的位置,通过2种方法进行约束,一种是通过LayoutParms进行约束,一种是ConstraintSet对象提供了connect方法进行约束;
  • 最后,applyTo到该根布局上。

注意:每个View必须要有ID,否则会抛出异常

以下是code展示:

        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(mConstraintLayout);

        constraintSet.clear(mLayoutRoom.getId());
        constraintSet.connect(mLayoutRoom.getId(), ConstraintSet.LEFT, mConstraintLayout.getId(), ConstraintSet.LEFT);
        constraintSet.connect(mLayoutRoom.getId(), ConstraintSet.TOP, mConstraintLayout.getId(), ConstraintSet.TOP);
        constraintSet.connect(mLayoutRoom.getId(), ConstraintSet.RIGHT, mConstraintLayout.getId(), ConstraintSet.RIGHT);
        constraintSet.connect(mLayoutRoom.getId(), ConstraintSet.BOTTOM, mConstraintLayout.findViewById(R.id.guideline).getId(), ConstraintSet.TOP);


        constraintSet.clear(mLayoutContainer.getId());
        constraintSet.connect(mLayoutContainer.getId(), ConstraintSet.LEFT, mConstraintLayout.getId(), ConstraintSet.LEFT);
        constraintSet.connect(mLayoutContainer.getId(), ConstraintSet.TOP, mConstraintLayout.getId(), ConstraintSet.TOP);
        constraintSet.connect(mLayoutContainer.getId(), ConstraintSet.RIGHT, mConstraintLayout.getId(), ConstraintSet.RIGHT);
        constraintSet.connect(mLayoutContainer.getId(), ConstraintSet.BOTTOM, mConstraintLayout.findViewById(R.id.guideline2).getId(), ConstraintSet.BOTTOM);


        constraintSet.clear(mLayoutBottom.getId());
        constraintSet.connect(mLayoutBottom.getId(), ConstraintSet.LEFT, mConstraintLayout.getId(), ConstraintSet.LEFT);
        constraintSet.connect(mLayoutBottom.getId(), ConstraintSet.TOP, mConstraintLayout.findViewById(R.id.guideline2).getId(), ConstraintSet.BOTTOM);
        constraintSet.connect(mLayoutBottom.getId(), ConstraintSet.RIGHT, mConstraintLayout.getId(), ConstraintSet.RIGHT);
        constraintSet.connect(mLayoutBottom.getId(), ConstraintSet.BOTTOM, mConstraintLayout.getId(), ConstraintSet.BOTTOM);

        constraintSet.applyTo(mConstraintLayout);

 

 

你可能感兴趣的:(Android)