自定义节操视频播放界面(一)

CustomJCVideo

需求

  • 用户在全屏播放视频与普通播放视频状态下的返回按钮动作不一样, 前者结束全屏状态后者结束本页面
  • 添加第三方分享按钮

思路

  • 需要自定义界面添加按钮并修改相应逻辑

实现

  • 由于是用Gradle管理jar包 所以不能直接修改源码 通过阅读源码得知修改系统布局是由此语句控制

public abstract int getLayoutId();

从jar包中找出系统布局复制到自己的layout下同时新建MyJCVideoStandard继承JCVideoPlayerStandard复写getLayoutId将自己的布局替换之

  • 添加分享按钮或者其他需要的东西并在MyJCVideoStandard初始化并添加逻辑

这里我是通过回调将其点击事件回调

  • 最后将MyJCVideoStandard应用到自己的项目即可

对于返回按钮的逻辑复写

  • 通过阅读源码得知在普通播放模式下返回按钮是GONE状态
    我们需要将其显示出来

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /**
    * 重写此方法使backButton在普通状态下也显示出来
    */
    @Override
    public boolean setUp(String url, int screen, Object... objects) {
    if (objects.length == 0) return false;
    if (super.setUp(url, screen, objects)) {
    titleTextView.setText(objects[0].toString());
    if (currentScreen == SCREEN_WINDOW_FULLSCREEN) {
    fullscreenButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_shrink);
    backButton.setVisibility(View.VISIBLE);
    tinyBackImageView.setVisibility(View.INVISIBLE);
    } else if (currentScreen == SCREEN_LAYOUT_NORMAL
    || currentScreen == SCREEN_LAYOUT_LIST) {
    fullscreenButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_enlarge);
    backButton.setVisibility(View.VISIBLE);
    tinyBackImageView.setVisibility(View.INVISIBLE);
    } else if (currentScreen == SCREEN_WINDOW_TINY) {
    tinyBackImageView.setVisibility(View.VISIBLE);
    setAllControlsVisible(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
    View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
    }
    return true;
    }
    return false;
    }
  • 重写onClick()复写逻辑

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    /**
    * 重写该方法使
    * * 自定义按钮设置点击事件
    * * 重写返回按钮的点击事件
    */
    @Override
    public void onClick(View v) {
    super.onClick(v);
    int id = v.getId();
    if (id == R.id.custom_btn) {
    if (currentScreen == SCREEN_LAYOUT_LIST) customBtn.setVisibility(VISIBLE);
    else customBtn.setVisibility(GONE);

    if (currentState == CURRENT_STATE_PLAYING) {
    JCMediaManager.instance().mediaPlayer.pause();
    setUiWitStateAndScreen(CURRENT_STATE_PAUSE);
    }
    listener.onCustom();

    } else if (id == R.id.back) {
    if (currentScreen == SCREEN_LAYOUT_NORMAL
    || currentScreen == SCREEN_LAYOUT_LIST) {
    listener.onBack();
    } else {
    backPress();
    }
    }
    }

注:

  • 在某些情况下activity进入onPause()
    比如第三方分享、回复消息、接个电话亦或是主动熄屏了
    那么这时候我们需要暂停视频并且在用户回来后可以继续点击播放不会重新开始

  • 在JCVideoPlayer中我们知道以下代码用来释放所有视频再次播放将重新开始所以这是用在onDestroy()的

    JCVideoPlayer.releaseAllVideos();

  • 而想让其单纯的暂停视频呢?可以使用如下方法

    vdVideoPlayer.startButton.performClick();

  • 我们也可以这样做

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    protected void onPause() {
    super.onPause();
    int state = vdVideoPlayer.getState(); //视频目前的状态
    if (vdVideoPlayer != null && state == JCVideoPlayer.CURRENT_STATE_PLAYING) { //如果正在播放
    JCMediaManager.instance().mediaPlayer.pause(); //暂停 ↓并将UI设置为暂停时的状态
    vdVideoPlayer.setUiWitStateAndScreen(JCVideoPlayer.CURRENT_STATE_PAUSE);
    }
    }

点这里查看demo