jiecaovideo开源项目笔记-JCVideoPlayer分析-小屏逻辑

本文主要分析了JCVideoPlayer开源项目中全屏视频如何切换回小屏的过程,包括backPress方法的作用及不同场景下的处理,以及全屏切换小屏的具体实现细节,涉及监听器状态判断和视图操作。

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

扯淡部分

这里的小屏指的是全屏切换到小屏幕

其实上篇博客小屏切换全屏看明白了,其实这个都无所谓看不看,直接切换到小屏的视频输出就好了

public static boolean backPress() {
        Log.i(TAG, "backPress");
        if (JCVideoPlayerManager.listener() != null) {
            return JCVideoPlayerManager.listener().goToOtherListener();
        }
        return false;
    }

这个就是返回的代码。就这几行扯什么淡呢?

backPress作用

backPress方法是静态,开源的大大要求在有视频播放的界面这样复写activity的onBackPressed

    @Override
    public void onBackPressed() {
        if (JCVideoPlayer.backPress()) {
            return;
        }
        super.onBackPressed();
    }
这就是返回键的监听,因为全屏模式和小屏模式是同一个activity。如果你不这样重写会导致,全屏下点击返回键全屏会被关掉,小屏所在的activity也会被关闭

这里先扯下backPress方法在不同情况下的处理

1、当没有播放的时候listener肯定为空。返回键交给系统处理

2、当小屏播放的时候,返回键也会交给系统处理。这个为什么等下分析全屏切小屏的时候会说的

3、当全屏的时候,返回键则会应用处理,应用会关掉全屏(也就是全屏切换小屏的逻辑)

4、当代码调用直接进入全屏的时候,也就是没有小屏的时候,会直接关掉播放,但是返回键还是应用处理,不会交给系统


分析全屏切换小屏

从第一段代码中可以看到回调到goToOtherListener,listener就是当前视频输出的 JCVideoPlayer对象

    @Override
    public boolean goToOtherListener() {//这里这个名字这么写并不对,这是在回退的时候gotoother,如果直接gotoother就不叫这个名字
        Log.i(TAG, "goToOtherListener " + " [" + this.hashCode() + "] ");
        
        if (currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN
                || currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_TINY) {
//            if (currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN) {
//                final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.quit_fullscreen);
//                startAnimation(ra);
//            }
            onEvent(currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN ?
                    JCBuriedPoint.ON_QUIT_FULLSCREEN :
                    JCBuriedPoint.ON_QUIT_TINYSCREEN);
            if (JCVideoPlayerManager.lastListener() == null) {//directly fullscreen   如果从小屏幕中点击全屏进来  lastListener必然不为null
                JCVideoPlayerManager.listener().onCompletion();  //如果是直接进入全屏状态下 点击小屏按钮后则直接播放完成
                showSupportActionBar(getContext());
                return true;
            }
            ViewGroup vp = (ViewGroup) (JCUtils.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT);
            vp.removeView(this);
            JCVideoPlayerManager.setListener(JCVideoPlayerManager.lastListener());
            JCVideoPlayerManager.setLastListener(null);
            JCMediaManager.instance().lastState = currentState;//save state
            JCVideoPlayerManager.listener().goBackThisListener();
            CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();
            return true;
        }
        return false;
    }
这个方法只有在小屏幕也就是右下角小屏播放和全屏的时候才会处理,其他情况下则直接返回false--这个也证明了刚刚说的backPress方法的第二点

跟着的代码是判断lastListener是否为null,如果为null就判断为直接进入全屏没有小屏幕的。

这里稍微说下两个listener。当小屏播放的时候lastListener为null,listener为当前的this,全屏播放为jcVideoPlayer对象lastListener为this。

所以小屏切全屏下lastListener必定不为null,为null则为直接进入全屏

如果是直接进入的全屏则直接设置播放完成

接着也就是全屏切换到小屏的操作,找到屏幕最根view,removeView(jcVideoPlayer)或者this。

接着回调到listener的goBackThisListener方法。这个方法也很好理解只调用了addTextureView


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值