0、相关文章:
仿微信视频通话大小视图切换(SurfaceView实现)(文章1:阅读量3k,2赞,2018.7.22)
Android视频聊天或直播,大小视频切换思路和代码(文章2:阅读量8k,3赞,2016.8.3)
1、正文:
下载了文章1中的demo,但是由于工程的原因,无法编译成功,于是自己新建了项目,把一些文件拷贝过来,顺利运行。
1.1、MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//远端的视图
private SurfaceView surfaceviewRemote;
//本地的视图
private SurfaceView surfaceviewLocal;
//本地视图大小
private RelativeLayout rlRemote;
private RelativeLayout rlLocal;
//拨打电话状态栏
private LinearLayout llCallContainer;
//默认本地视图的状态
private boolean mSate = true;
//默认本地视频宽度 90dp
private int defaultLocalwidth = 90;
private int defaultLocalHeight;
//默认本地视频边距 20dp
private int defaultLocalMargin = 20;
private Handler uiHandler;
//视频源1 2
private MediaPlayer mediaPlayer;
private MediaPlayer mediaPlayer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果判断有刘海屏不让填充到状态栏
if (DisplayUtil.hasNotchScreen(this)) {
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
} else {
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
setContentView(R.layout.activity_main);
llCallContainer = findViewById(R.id.ll_call_container);
rlRemote = findViewById(R.id.rl_remote);
surfaceviewRemote = findViewById(R.id.surfaceview_remote);
rlLocal = findViewById(R.id.rl_local);
surfaceviewLocal = findViewById(R.id.surfaceview_local);
surfaceviewRemote.setOnClickListener(this);
surfaceviewLocal.setOnClickListener(this);
//初始化视频源
mediaPlayer = new MediaPlayer();
mediaPlayer2 = new MediaPlayer();
SurfaceHolder remoteHolder = surfaceviewRemote.getHolder();
remoteHolder.setFormat(PixelFormat.TRANSPARENT);
remoteHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
play2();
LogUtils.e("Remote + surfaceCreated");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
LogUtils.e( "Remote + surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
pause2();
LogUtils.e( "Remote + surfaceDestroyed");
}
});
surfaceviewLocal.setZOrderOnTop(true);
surfaceviewLocal.setZOrderMediaOverlay(true);
SurfaceHolder localHolder = surfaceviewLocal.getHolder();
localHolder.setFormat(PixelFormat.TRANSPARENT);
localHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
play();
LogUtils.e( "Local + surfaceCreated");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
LogUtils.e("Local + surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
pause();
LogUtils.e( "Local + surfaceDestroyed");
}
});
defaultLocalMargin = DisplayUtil.dip2px(this, defaultLocalMargin);
defaultLoc