仿微信视频通话大小视图切换(SurfaceView实现)

本文介绍了如何使用SurfaceView实现仿微信视频通话的大小视图切换功能。作者通过分析文章1的代码并新建项目,成功运行了示例。主要内容包括MainActivity.java、activity_main.xml和DisplayUtil.java的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值