Przeglądaj źródła

更新demo案例

杨充 4 lat temu
rodzic
commit
de454860dc
22 zmienionych plików z 1037 dodań i 27 usunięć
  1. 9 8
      Demo/build.gradle
  2. 3 0
      Demo/src/main/AndroidManifest.xml
  3. 1 1
      Demo/src/main/java/org/yczbj/ycvideoplayer/ConstantVideo.java
  4. 14 0
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/activity/TypeActivity.java
  5. 4 0
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/ad/AdActivity.java
  6. 7 6
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/list/PlayerMonitor.java
  7. 193 0
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/list/RecyclerView2Fragment.java
  8. 12 1
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/list/TestListActivity.java
  9. 218 0
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok1Activity.java
  10. 76 0
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok1ListAdapter.java
  11. 63 0
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok1ListFragment.java
  12. 39 0
      Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok2Activity.java
  13. 18 2
      Demo/src/main/res/layout/activity_new.xml
  14. 144 0
      VideoKernel/src/main/java/com/yc/kernel/impl/tx/TxMediaPlayer.java
  15. 43 0
      VideoKernel/src/main/java/com/yc/kernel/impl/tx/TxPlayerFactory.java
  16. 20 5
      VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/controller/BaseVideoController.java
  17. 4 2
      VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/controller/OrientationHelper.java
  18. 78 0
      VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/more/CustomNetworkView.java
  19. 78 0
      VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/more/CustomTrailersView.java
  20. 6 0
      VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/view/BasisVideoController.java
  21. 6 1
      VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/view/CustomTitleView.java
  22. 1 1
      VideoPlayer/src/main/res/layout/custom_video_player_top.xml

+ 9 - 8
Demo/build.gradle

@@ -59,14 +59,15 @@ dependencies {
     implementation 'com.github.ctiao:ndkbitmap-armv7a:0.9.21'
 
     //自己封装的库,都有对应的案例项目【欢迎star】:https://github.com/yangchong211
-    implementation 'cn.yc:YCStateLib:1.1'                                  //状态管理
-//    implementation project(':VideoCache')
-//    implementation project(':VideoPlayer')
-//    implementation project(':VideoKernel')
+    implementation 'com.yc:PagerLib:1.0.1'
+    implementation 'cn.yc:YCStateLib:1.2.2'                                  //状态管理
+    implementation project(':VideoCache')
+    implementation project(':VideoPlayer')
+    implementation project(':VideoKernel')
 
-    implementation 'cn.yc:VideoPlayer:3.0.1'
-    implementation 'cn.yc:VideoCache:3.0.1'
-    implementation 'cn.yc:VideoKernel:3.0.1'
-    implementation 'cn.yc:YCStatusBarLib:1.4.0'
+//    implementation 'cn.yc:VideoPlayer:3.0.1'
+//    implementation 'cn.yc:VideoCache:3.0.1'
+//    implementation 'cn.yc:VideoKernel:3.0.1'
+    implementation 'cn.yc:YCStatusBarLib:1.5.0'
  //状态栏
 }

+ 3 - 0
Demo/src/main/AndroidManifest.xml

@@ -74,6 +74,9 @@
         <activity android:name=".newPlayer.tiktok.TikTok2Activity"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:screenOrientation="portrait"/>
+        <activity android:name=".newPlayer.tiktok.TikTok1Activity"
+            android:configChanges="orientation|keyboardHidden|screenSize"
+            android:screenOrientation="portrait"/>
         <activity android:name=".oldPlayer.TestFullActivity2"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:screenOrientation="portrait"/>

+ 1 - 1
Demo/src/main/java/org/yczbj/ycvideoplayer/ConstantVideo.java

@@ -45,7 +45,7 @@ public class ConstantVideo {
                 "http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4"));
 
         videoList.add(new VideoInfoBean("把本地项目代码复制到拷贝的仓库",
-                "hhttps://img-blog.csdnimg.cn/2020101309293329.png",
+                "https://img-blog.csdnimg.cn/2020101309293329.png",
                 "http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4"));
 
         videoList.add(new VideoInfoBean("有bug,可以直接提出来,欢迎一起探讨",

+ 14 - 0
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/activity/TypeActivity.java

@@ -59,6 +59,8 @@ public class TypeActivity extends AppCompatActivity implements View.OnClickListe
     private TextView mTv62;
     private TextView mTv63;
     private TextView mTv64;
+    private TextView mTv65;
+    private TextView mTv66;
     private TextView mTv71;
     private TextView mTv81;
     private TextView mTv101;
@@ -106,6 +108,8 @@ public class TypeActivity extends AppCompatActivity implements View.OnClickListe
         mTv62 = findViewById(R.id.tv_6_2);
         mTv63 = findViewById(R.id.tv_6_3);
         mTv64 = findViewById(R.id.tv_6_4);
+        mTv65 = findViewById(R.id.tv_6_5);
+        mTv66 = findViewById(R.id.tv_6_6);
         mTv71 = findViewById(R.id.tv_7_1);
         mTv81 = findViewById(R.id.tv_8_1);
         mTv101 = findViewById(R.id.tv_10_1);
@@ -130,6 +134,8 @@ public class TypeActivity extends AppCompatActivity implements View.OnClickListe
         mTv62.setOnClickListener(this);
         mTv63.setOnClickListener(this);
         mTv64.setOnClickListener(this);
+        mTv65.setOnClickListener(this);
+        mTv66.setOnClickListener(this);
         mTv71.setOnClickListener(this);
         mTv81.setOnClickListener(this);
         mTv101.setOnClickListener(this);
@@ -182,6 +188,14 @@ public class TypeActivity extends AppCompatActivity implements View.OnClickListe
             Intent intent = new Intent(this, TestListActivity.class);
             intent.putExtra("type",3);
             startActivity(intent);
+        } else if (v == mTv65){
+            Intent intent = new Intent(this, TestListActivity.class);
+            intent.putExtra("type",4);
+            startActivity(intent);
+        } else if (v == mTv66){
+            Intent intent = new Intent(this, TestListActivity.class);
+            intent.putExtra("type",5);
+            startActivity(intent);
         } else if (v == mTv71){
             startActivity(new Intent(this, DanmuActivity.class));
         } else if (v == mTv81){

+ 4 - 0
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/ad/AdActivity.java

@@ -100,6 +100,10 @@ public class AdActivity extends AppCompatActivity implements View.OnClickListene
         mVideoPlayer.setController(controller);
         HttpProxyCacheServer cacheServer = ProxyVideoCacheManager.getProxy(this);
         String proxyUrl = cacheServer.getProxyUrl(URL_AD);
+        HttpProxyCacheServer server = new HttpProxyCacheServer(this);
+        String proxyVideoUrl = server.getProxyUrl(URL_AD);
+
+
         mVideoPlayer.setUrl(proxyUrl);
         mVideoPlayer.start();
         //监听播放结束

+ 7 - 6
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/list/PlayerMonitor.java

@@ -15,6 +15,7 @@ import org.yczbj.ycvideoplayerlib.tool.PlayerUtils;
 public class PlayerMonitor implements InterControlView {
 
     private ControlWrapper mControlWrapper;
+    private static final String TAG = "PlayerMonitor";
 
     @Override
     public void attach(@NonNull ControlWrapper controlWrapper) {
@@ -28,27 +29,27 @@ public class PlayerMonitor implements InterControlView {
 
     @Override
     public void onVisibilityChanged(boolean isVisible, Animation anim) {
-        VideoLogUtils.d("onVisibilityChanged: " + isVisible);
+        VideoLogUtils.d(TAG+ "---" +"onVisibilityChanged: " + isVisible);
     }
 
     @Override
     public void onPlayStateChanged(int playState) {
-        VideoLogUtils.d("onPlayStateChanged: " + PlayerUtils.playState2str(playState));
+        VideoLogUtils.d(TAG+ "---" +"onPlayStateChanged: " + PlayerUtils.playState2str(playState));
     }
 
     @Override
     public void onPlayerStateChanged(int playerState) {
-        VideoLogUtils.d("onPlayerStateChanged: " + PlayerUtils.playerState2str(playerState));
+        VideoLogUtils.d(TAG+ "---" +"onPlayerStateChanged: " + PlayerUtils.playerState2str(playerState));
     }
 
     @Override
     public void setProgress(int duration, int position) {
-        VideoLogUtils.d("setProgress: duration: " + duration + " position: " + position + " buffered percent: " + mControlWrapper.getBufferedPercentage());
-        VideoLogUtils.d("network speed: " + mControlWrapper.getTcpSpeed());
+        VideoLogUtils.d(TAG+ "---" +"setProgress: duration: " + duration + " position: " + position + " buffered percent: " + mControlWrapper.getBufferedPercentage());
+        VideoLogUtils.d(TAG+ "---" +"network speed: " + mControlWrapper.getTcpSpeed());
     }
 
     @Override
     public void onLockStateChanged(boolean isLocked) {
-        VideoLogUtils.d("onLockStateChanged: " + isLocked);
+        VideoLogUtils.d(TAG+ "---" +"onLockStateChanged: " + isLocked);
     }
 }

+ 193 - 0
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/list/RecyclerView2Fragment.java

@@ -0,0 +1,193 @@
+package org.yczbj.ycvideoplayer.newPlayer.list;
+
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.yc.pagerlib.recycler.ScrollPageHelper;
+
+import org.yczbj.ycvideoplayer.ConstantVideo;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayerlib.config.ConstantKeys;
+import org.yczbj.ycvideoplayerlib.config.VideoInfoBean;
+import org.yczbj.ycvideoplayerlib.player.VideoPlayer;
+import org.yczbj.ycvideoplayerlib.player.VideoViewManager;
+import org.yczbj.ycvideoplayerlib.tool.PlayerUtils;
+import org.yczbj.ycvideoplayerlib.ui.view.BasisVideoController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * RecyclerView demo
+ */
+public class RecyclerView2Fragment extends Fragment {
+
+    protected List<VideoInfoBean> mVideos = new ArrayList<>();
+    protected VideoRecyclerViewAdapter mAdapter;
+    protected RecyclerView mRecyclerView;
+    protected LinearLayoutManager mLinearLayoutManager;
+
+    protected VideoPlayer mVideoView;
+    protected BasisVideoController mController;
+
+    /**
+     * 当前播放的位置
+     */
+    protected int mCurPos = -1;
+    /**
+     * 上次播放的位置,用于页面切回来之后恢复播放
+     */
+    protected int mLastPos = mCurPos;
+    private Context context;
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        super.onAttach(context);
+        this.context = context;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.base_recycler_view, container, false);
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        initView(view);
+        initData();
+    }
+
+    protected void initView(View view) {
+        initVideoView();
+        mRecyclerView = view.findViewById(R.id.recyclerView);
+        mLinearLayoutManager = new LinearLayoutManager(getContext());
+        mRecyclerView.setLayoutManager(mLinearLayoutManager);
+        mAdapter = new VideoRecyclerViewAdapter(mVideos);
+        mAdapter.setOnItemChildClickListener(new OnItemChildClickListener() {
+            @Override
+            public void onItemChildClick(int position) {
+                startPlay(position);
+            }
+        });
+        mRecyclerView.setAdapter(mAdapter);
+        ScrollPageHelper snapHelper = new ScrollPageHelper(Gravity.TOP,false);
+        snapHelper.attachToRecyclerView(mRecyclerView);
+        mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
+            @Override
+            public void onChildViewAttachedToWindow(@NonNull View view) {
+
+            }
+
+            @Override
+            public void onChildViewDetachedFromWindow(@NonNull View view) {
+                FrameLayout playerContainer = view.findViewById(R.id.player_container);
+                View v = playerContainer.getChildAt(0);
+                if (v != null && v == mVideoView && !mVideoView.isFullScreen()) {
+                    releaseVideoView();
+                }
+            }
+        });
+    }
+
+    protected void initVideoView() {
+        mVideoView = new VideoPlayer(context);
+        mVideoView.setOnStateChangeListener(new VideoPlayer.SimpleOnStateChangeListener() {
+            @Override
+            public void onPlayStateChanged(int playState) {
+                //监听VideoViewManager释放,重置状态
+                if (playState == ConstantKeys.CurrentState.STATE_IDLE) {
+                    PlayerUtils.removeViewFormParent(mVideoView);
+                    mLastPos = mCurPos;
+                    mCurPos = -1;
+                }
+            }
+        });
+        mController = new BasisVideoController(context);
+        mVideoView.setController(mController);
+    }
+
+    protected void initData() {
+        List<VideoInfoBean> videoList = ConstantVideo.getVideoList();
+        mVideos.addAll(videoList);
+        mAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        pause();
+    }
+
+    /**
+     * 由于onPause必须调用super。故增加此方法,
+     * 子类将会重写此方法,改变onPause的逻辑
+     */
+    protected void pause() {
+        releaseVideoView();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        resume();
+    }
+
+    /**
+     * 由于onResume必须调用super。故增加此方法,
+     * 子类将会重写此方法,改变onResume的逻辑
+     */
+    protected void resume() {
+        if (mLastPos == -1)
+            return;
+        //恢复上次播放的位置
+        startPlay(mLastPos);
+    }
+
+    /**
+     * 开始播放
+     * @param position 列表位置
+     */
+    protected void startPlay(int position) {
+        if (mCurPos == position) return;
+        if (mCurPos != -1) {
+            releaseVideoView();
+        }
+        VideoInfoBean videoBean = mVideos.get(position);
+        mVideoView.setUrl(videoBean.getVideoUrl());
+        View itemView = mLinearLayoutManager.findViewByPosition(position);
+        if (itemView == null) return;
+        VideoRecyclerViewAdapter.VideoHolder viewHolder = (VideoRecyclerViewAdapter.VideoHolder) itemView.getTag();
+        //把列表中预置的PrepareView添加到控制器中,注意isPrivate此处只能为true。
+        mController.addControlComponent(viewHolder.mPrepareView, true);
+        PlayerUtils.removeViewFormParent(mVideoView);
+        viewHolder.mPlayerContainer.addView(mVideoView, 0);
+        //播放之前将VideoView添加到VideoViewManager以便在别的页面也能操作它
+        VideoViewManager.instance().add(mVideoView, "list");
+        mVideoView.start();
+        mCurPos = position;
+    }
+
+    private void releaseVideoView() {
+        mVideoView.release();
+        if (mVideoView.isFullScreen()) {
+            mVideoView.stopFullScreen();
+        }
+        if(getActivity().getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
+            getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        }
+        mCurPos = -1;
+    }
+}

+ 12 - 1
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/list/TestListActivity.java

@@ -2,6 +2,7 @@ package org.yczbj.ycvideoplayer.newPlayer.list;
 
 import org.yczbj.ycvideoplayer.BaseActivity;
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.newPlayer.tiktok.TikTok1ListFragment;
 import org.yczbj.ycvideoplayer.newPlayer.tiktok.TikTokListFragment;
 import org.yczbj.ycvideoplayerlib.old.other.VideoPlayerManager;
 
@@ -42,11 +43,21 @@ public class TestListActivity extends BaseActivity {
                     .beginTransaction()
                     .add(R.id.container, new TikTokListFragment())
                     .commit();
-        } else {
+        } else if (type==3){
+            getSupportFragmentManager()
+                    .beginTransaction()
+                    .add(R.id.container, new TikTok1ListFragment())
+                    .commit();
+        }else if (type==4){
             getSupportFragmentManager()
                     .beginTransaction()
                     .add(R.id.container, new SeamlessPlayFragment())
                     .commit();
+        }else {
+            getSupportFragmentManager()
+                    .beginTransaction()
+                    .add(R.id.container, new RecyclerView2Fragment())
+                    .commit();
         }
 
     }

+ 218 - 0
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok1Activity.java

@@ -0,0 +1,218 @@
+package org.yczbj.ycvideoplayer.newPlayer.tiktok;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.OrientationHelper;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager.widget.ViewPager;
+
+import com.yc.kernel.utils.VideoLogUtils;
+import com.yc.pagerlib.recycler.OnPagerListener;
+import com.yc.pagerlib.recycler.PagerLayoutManager;
+import com.yc.videocache.cache.PreloadManager;
+import com.yc.videocache.cache.ProxyVideoCacheManager;
+
+import org.yczbj.ycvideoplayer.ConstantVideo;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.newPlayer.list.OnItemChildClickListener;
+import org.yczbj.ycvideoplayer.newPlayer.list.VideoRecyclerViewAdapter;
+import org.yczbj.ycvideoplayerlib.config.ConstantKeys;
+import org.yczbj.ycvideoplayerlib.config.VideoInfoBean;
+import org.yczbj.ycvideoplayerlib.player.VideoPlayer;
+import org.yczbj.ycvideoplayerlib.player.VideoViewManager;
+import org.yczbj.ycvideoplayerlib.tool.PlayerUtils;
+import org.yczbj.ycvideoplayerlib.ui.view.BasisVideoController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.ycbjie.ycstatusbarlib.bar.StateAppBar;
+
+
+/**
+ * 模仿抖音短视频,使用RecyclerView,实现了预加载功能
+ */
+
+public class TikTok1Activity extends AppCompatActivity {
+
+
+    protected List<VideoInfoBean> mVideos = new ArrayList<>();
+    protected VideoRecyclerViewAdapter mAdapter;
+    protected RecyclerView mRecyclerView;
+    protected PagerLayoutManager mLinearLayoutManager;
+    protected VideoPlayer mVideoView;
+    protected BasisVideoController mController;
+
+    /**
+     * 当前播放的位置
+     */
+    protected int mCurPos = -1;
+    /**
+     * 上次播放的位置,用于页面切回来之后恢复播放
+     */
+    protected int mLastPos = mCurPos;
+    private static final String KEY_INDEX = "index";
+
+    public static void start(Context context, int index) {
+        Intent i = new Intent(context, TikTok2Activity.class);
+        i.putExtra(KEY_INDEX, index);
+        context.startActivity(i);
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.base_recycler_view);
+        mCurPos = getIntent().getIntExtra(KEY_INDEX, 0);
+        initView();
+        initData();
+    }
+
+    protected void initView() {
+        initVideoView();
+        mRecyclerView = findViewById(R.id.recyclerView);
+        mLinearLayoutManager= new PagerLayoutManager(this, OrientationHelper.VERTICAL);
+        mRecyclerView.setLayoutManager(mLinearLayoutManager);
+        mAdapter = new VideoRecyclerViewAdapter(mVideos);
+        mAdapter.setOnItemChildClickListener(new OnItemChildClickListener() {
+            @Override
+            public void onItemChildClick(int position) {
+                startPlay(position);
+            }
+        });
+        mRecyclerView.setAdapter(mAdapter);
+        mLinearLayoutManager.setOnViewPagerListener(new OnPagerListener() {
+            @Override
+            public void onInitComplete() {
+                System.out.println("OnPagerListener---onInitComplete--"+"初始化完成");
+            }
+
+            @Override
+            public void onPageRelease(boolean isNext, int position) {
+                System.out.println("OnPagerListener---onPageRelease--"+position+"-----"+isNext);
+            }
+
+            @Override
+            public void onPageSelected(int position, boolean isBottom) {
+                System.out.println("OnPagerListener---onPageSelected--"+position+"-----"+isBottom);
+
+            }
+        });
+        mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
+            @Override
+            public void onChildViewAttachedToWindow(@NonNull View view) {
+
+            }
+
+            @Override
+            public void onChildViewDetachedFromWindow(@NonNull View view) {
+                FrameLayout playerContainer = view.findViewById(R.id.player_container);
+                View v = playerContainer.getChildAt(0);
+                if (v != null && v == mVideoView && !mVideoView.isFullScreen()) {
+                    releaseVideoView();
+                }
+            }
+        });
+    }
+
+    protected void initVideoView() {
+        mVideoView = new VideoPlayer(this);
+        mVideoView.setOnStateChangeListener(new VideoPlayer.SimpleOnStateChangeListener() {
+            @Override
+            public void onPlayStateChanged(int playState) {
+                //监听VideoViewManager释放,重置状态
+                if (playState == ConstantKeys.CurrentState.STATE_IDLE) {
+                    PlayerUtils.removeViewFormParent(mVideoView);
+                    mLastPos = mCurPos;
+                    mCurPos = -1;
+                }
+            }
+        });
+        mController = new BasisVideoController(this);
+        mVideoView.setController(mController);
+    }
+
+    protected void initData() {
+        List<VideoInfoBean> videoList = ConstantVideo.getVideoList();
+        mVideos.addAll(videoList);
+        mAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        pause();
+    }
+
+    /**
+     * 由于onPause必须调用super。故增加此方法,
+     * 子类将会重写此方法,改变onPause的逻辑
+     */
+    protected void pause() {
+        releaseVideoView();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        resume();
+    }
+
+    /**
+     * 由于onResume必须调用super。故增加此方法,
+     * 子类将会重写此方法,改变onResume的逻辑
+     */
+    protected void resume() {
+        if (mLastPos == -1)
+            return;
+        //恢复上次播放的位置
+        startPlay(mLastPos);
+    }
+
+    /**
+     * 开始播放
+     * @param position 列表位置
+     */
+    protected void startPlay(int position) {
+        if (mCurPos == position) return;
+        if (mCurPos != -1) {
+            releaseVideoView();
+        }
+        VideoInfoBean videoBean = mVideos.get(position);
+        mVideoView.setUrl(videoBean.getVideoUrl());
+        View itemView = mLinearLayoutManager.findViewByPosition(position);
+        if (itemView == null) return;
+        VideoRecyclerViewAdapter.VideoHolder viewHolder = (VideoRecyclerViewAdapter.VideoHolder) itemView.getTag();
+        //把列表中预置的PrepareView添加到控制器中,注意isPrivate此处只能为true。
+        mController.addControlComponent(viewHolder.mPrepareView, true);
+        PlayerUtils.removeViewFormParent(mVideoView);
+        viewHolder.mPlayerContainer.addView(mVideoView, 0);
+        //播放之前将VideoView添加到VideoViewManager以便在别的页面也能操作它
+        VideoViewManager.instance().add(mVideoView, "list");
+        mVideoView.start();
+        mCurPos = position;
+    }
+
+    private void releaseVideoView() {
+        mVideoView.release();
+        if (mVideoView.isFullScreen()) {
+            mVideoView.stopFullScreen();
+        }
+        if(this.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
+            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        }
+        mCurPos = -1;
+    }
+
+}

+ 76 - 0
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok1ListAdapter.java

@@ -0,0 +1,76 @@
+package org.yczbj.ycvideoplayer.newPlayer.tiktok;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.Glide;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayerlib.config.VideoInfoBean;
+
+import java.util.List;
+
+public class TikTok1ListAdapter extends RecyclerView.Adapter<TikTok1ListAdapter.TikTokListViewHolder> {
+
+    public List<VideoInfoBean> data;
+
+    private int mId;
+
+    public TikTok1ListAdapter(List<VideoInfoBean> data) {
+        this.data = data;
+    }
+
+    @NonNull
+    @Override
+    public TikTokListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tiktok_list, parent, false);
+        return new TikTokListViewHolder(itemView);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull TikTokListViewHolder holder, int position) {
+        VideoInfoBean item = data.get(position);
+        holder.mTitle.setText(item.getTitle());
+        Glide.with(holder.mThumb.getContext())
+                .load(item.getCover())
+                .into(holder.mThumb);
+
+        holder.mPosition = position;
+    }
+
+    @Override
+    public int getItemCount() {
+        return data == null ? 0 : data.size();
+    }
+
+    public void setImpl(int id) {
+        mId = id;
+    }
+
+    public class TikTokListViewHolder extends RecyclerView.ViewHolder {
+
+        public ImageView mThumb;
+        public TextView mTitle;
+
+        public int mPosition;
+
+        public TikTokListViewHolder(@NonNull View itemView) {
+            super(itemView);
+            mThumb = itemView.findViewById(R.id.iv_thumb);
+            mTitle = itemView.findViewById(R.id.tv_title);
+
+            itemView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    TikTok1Activity.start(itemView.getContext(), mPosition);
+                }
+            });
+        }
+    }
+}

+ 63 - 0
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok1ListFragment.java

@@ -0,0 +1,63 @@
+package org.yczbj.ycvideoplayer.newPlayer.tiktok;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import org.yczbj.ycvideoplayer.ConstantVideo;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayerlib.config.VideoInfoBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TikTok1ListFragment extends Fragment {
+
+    private List<VideoInfoBean> data = new ArrayList<>();
+    private RecyclerView mRecyclerView;
+    private TikTok1ListAdapter mAdapter;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.base_recycler_view, container, false);
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        initView(view);
+        initData();
+    }
+
+
+    protected void initView(View view) {
+        mRecyclerView = view.findViewById(R.id.recyclerView);
+        mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
+        mAdapter = new TikTok1ListAdapter(data);
+        mRecyclerView.setAdapter(mAdapter);
+    }
+
+
+    protected void initData() {
+        //模拟请求数据
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                List<VideoInfoBean> tiktokBeans = ConstantVideo.getVideoList();
+                data.addAll(tiktokBeans);
+                mRecyclerView.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mAdapter.notifyDataSetChanged();
+                    }
+                });
+            }
+        }).start();
+    }
+}

+ 39 - 0
Demo/src/main/java/org/yczbj/ycvideoplayer/newPlayer/tiktok/TikTok2Activity.java

@@ -2,11 +2,14 @@ package org.yczbj.ycvideoplayer.newPlayer.tiktok;
 
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.view.View;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.RecyclerView;
 import androidx.viewpager.widget.ViewPager;
 
 import com.yc.kernel.utils.VideoLogUtils;
@@ -15,6 +18,8 @@ import org.yczbj.ycvideoplayer.ConstantVideo;
 import org.yczbj.ycvideoplayer.R;
 import com.yc.videocache.cache.PreloadManager;
 import com.yc.videocache.cache.ProxyVideoCacheManager;
+
+import org.yczbj.ycvideoplayerlib.config.ConstantKeys;
 import org.yczbj.ycvideoplayerlib.config.VideoInfoBean;
 import org.yczbj.ycvideoplayerlib.player.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.tool.PlayerUtils;
@@ -22,6 +27,8 @@ import org.yczbj.ycvideoplayerlib.ui.view.BasisVideoController;
 import java.util.ArrayList;
 import java.util.List;
 
+import cn.ycbjie.ycstatusbarlib.bar.StateAppBar;
+
 
 /**
  * 模仿抖音短视频,使用VerticalViewPager实现,实现了预加载功能
@@ -88,6 +95,7 @@ public class TikTok2Activity extends AppCompatActivity {
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_tiktok2);
+        StateAppBar.translucentStatusBar(this, true);
         initFindViewById();
         initListener();
         initView();
@@ -173,6 +181,36 @@ public class TikTok2Activity extends AppCompatActivity {
                 }
             }
         });
+
+//        RecyclerView recyclerView = new RecyclerView(this);
+//        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+//            /**
+//             * 是否反向滑动
+//             */
+//            private boolean mIsReverseScroll;
+//
+//            @Override
+//            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+//                super.onScrolled(recyclerView, dx, dy);
+//                if (dy>0){
+//                    //表示下滑
+//                    mIsReverseScroll = false;
+//                } else {
+//                    //表示上滑
+//                    mIsReverseScroll = true;
+//                }
+//            }
+//
+//            @Override
+//            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+//                super.onScrollStateChanged(recyclerView, newState);
+//                if (newState == VerticalViewPager.SCROLL_STATE_IDLE) {
+//                    mPreloadManager.resumePreload(mCurPos, mIsReverseScroll);
+//                } else {
+//                    mPreloadManager.pausePreload(mCurPos, mIsReverseScroll);
+//                }
+//            }
+//        });
     }
 
     private void startPlay(int position) {
@@ -188,6 +226,7 @@ public class TikTok2Activity extends AppCompatActivity {
                 String playUrl = mPreloadManager.getPlayUrl(tiktokBean.getVideoUrl());
                 VideoLogUtils.i("startPlay: " + "position: " + position + "  url: " + playUrl);
                 mVideoPlayer.setUrl(playUrl);
+                mVideoPlayer.setScreenScaleType(ConstantKeys.PlayerScreenScaleType.SCREEN_SCALE_16_9);
                 mController.addControlComponent(viewHolder.mTikTokView, true);
                 viewHolder.mPlayerContainer.addView(mVideoPlayer, 0);
                 mVideoPlayer.start();

+ 18 - 2
Demo/src/main/res/layout/activity_new.xml

@@ -180,7 +180,7 @@
                 android:layout_marginTop="10dp"
                 android:padding="10dp"
                 android:background="@color/colorAccent"
-                android:text="6.3 在列表中播放,类似抖音"/>
+                android:text="6.3 在列表中播放,类似抖音,使用ViewPager"/>
             <TextView
                 android:id="@+id/tv_6_4"
                 android:layout_width="match_parent"
@@ -188,7 +188,23 @@
                 android:layout_marginTop="10dp"
                 android:padding="10dp"
                 android:background="@color/colorAccent"
-                android:text="6.4 在fragment的列表播放无缝切换"/>
+                android:text="6.4 在列表中播放,类似抖音,使用RecyclerView"/>
+            <TextView
+                android:id="@+id/tv_6_5"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:padding="10dp"
+                android:background="@color/colorAccent"
+                android:text="6.5 在fragment的列表播放无缝切换"/>
+            <TextView
+                android:id="@+id/tv_6_6"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:padding="10dp"
+                android:background="@color/colorAccent"
+                android:text="6.6 在列表播放,一次滑动一个item"/>
             <TextView
                 android:id="@+id/tv_7_1"
                 android:layout_width="match_parent"

+ 144 - 0
VideoKernel/src/main/java/com/yc/kernel/impl/tx/TxMediaPlayer.java

@@ -0,0 +1,144 @@
+package com.yc.kernel.impl.tx;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+
+import com.yc.kernel.inter.AbstractVideoPlayer;
+
+import java.util.Map;
+
+/**
+ * <pre>
+ *     @author yangchong
+ *     blog  : https://github.com/yangchong211
+ *     time  : 2018/11/9
+ *     desc  : 腾讯player播放器内核
+ *     revise:
+ * </pre>
+ */
+public class TxMediaPlayer extends AbstractVideoPlayer {
+
+    private Context mAppContext;
+
+    public TxMediaPlayer(Context context) {
+        if (context instanceof Application){
+            mAppContext = context;
+        } else {
+            mAppContext = context.getApplicationContext();
+        }
+    }
+
+
+    @Override
+    public void initPlayer() {
+
+    }
+
+    @Override
+    public void setDataSource(String path, Map<String, String> headers) {
+
+    }
+
+    @Override
+    public void setDataSource(AssetFileDescriptor fd) {
+
+    }
+
+    @Override
+    public void setSurface(Surface surface) {
+
+    }
+
+    @Override
+    public void prepareAsync() {
+
+    }
+
+    @Override
+    public void start() {
+
+    }
+
+    @Override
+    public void pause() {
+
+    }
+
+    @Override
+    public void stop() {
+
+    }
+
+    @Override
+    public void reset() {
+
+    }
+
+    @Override
+    public boolean isPlaying() {
+        return false;
+    }
+
+    @Override
+    public void seekTo(long time) {
+
+    }
+
+    @Override
+    public void release() {
+
+    }
+
+    @Override
+    public long getCurrentPosition() {
+        return 0;
+    }
+
+    @Override
+    public long getDuration() {
+        return 0;
+    }
+
+    @Override
+    public int getBufferedPercentage() {
+        return 0;
+    }
+
+    @Override
+    public void setDisplay(SurfaceHolder holder) {
+
+    }
+
+    @Override
+    public void setVolume(float v1, float v2) {
+
+    }
+
+    @Override
+    public void setLooping(boolean isLooping) {
+
+    }
+
+    @Override
+    public void setOptions() {
+
+    }
+
+    @Override
+    public void setSpeed(float speed) {
+
+    }
+
+    @Override
+    public float getSpeed() {
+        return 0;
+    }
+
+    @Override
+    public long getTcpSpeed() {
+        return 0;
+    }
+}

+ 43 - 0
VideoKernel/src/main/java/com/yc/kernel/impl/tx/TxPlayerFactory.java

@@ -0,0 +1,43 @@
+/*
+Copyright 2017 yangchong211(github.com/yangchong211)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+package com.yc.kernel.impl.tx;
+
+import android.content.Context;
+
+import com.yc.kernel.factory.PlayerFactory;
+import com.yc.kernel.impl.media.AndroidMediaPlayer;
+
+
+/**
+ * <pre>
+ *     @author yangchong
+ *     blog  : https://github.com/yangchong211
+ *     time  : 2018/11/9
+ *     desc  : tx视频播放器Factory
+ *     revise:
+ * </pre>
+ */
+public class TxPlayerFactory extends PlayerFactory<TxMediaPlayer> {
+
+    public static TxPlayerFactory create() {
+        return new TxPlayerFactory();
+    }
+
+    @Override
+    public TxMediaPlayer createPlayer(Context context) {
+        return new TxMediaPlayer(context);
+    }
+}

+ 20 - 5
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/controller/BaseVideoController.java

@@ -79,7 +79,7 @@ public abstract class BaseVideoController extends FrameLayout implements InterVi
     protected boolean mIsLocked;
 
     //播放视图隐藏超时
-    protected int mDefaultTimeout = 4000;
+    protected int mDefaultTimeout = 5000;
 
     //是否开启根据屏幕方向进入/退出全屏
     private boolean mEnableOrientation;
@@ -265,6 +265,7 @@ public abstract class BaseVideoController extends FrameLayout implements InterVi
      */
     @CallSuper
     public void setPlayerState(@ConstantKeys.PlayModeType final int playerState) {
+        //调用此方法向控制器设置播放器状态
         handlePlayerStateChanged(playerState);
     }
 
@@ -469,7 +470,9 @@ public abstract class BaseVideoController extends FrameLayout implements InterVi
      * 横竖屏切换
      */
     protected void toggleFullScreen() {
-        mControlWrapper.toggleFullScreen(mActivity);
+        if (PlayerUtils.isActivityLiving(mActivity)){
+            mControlWrapper.toggleFullScreen(mActivity);
+        }
     }
 
     /**
@@ -478,7 +481,9 @@ public abstract class BaseVideoController extends FrameLayout implements InterVi
      * @return 是否成功进入全屏
      */
     protected boolean startFullScreen() {
-        if (mActivity == null || mActivity.isFinishing()) return false;
+        if (!PlayerUtils.isActivityLiving(mActivity)) {
+            return false;
+        }
         mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
         mControlWrapper.startFullScreen();
         return true;
@@ -490,7 +495,9 @@ public abstract class BaseVideoController extends FrameLayout implements InterVi
      * @return 是否成功退出全屏
      */
     protected boolean stopFullScreen() {
-        if (mActivity == null || mActivity.isFinishing()) return false;
+        if (!PlayerUtils.isActivityLiving(mActivity)) {
+            return false;
+        }
         mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         mControlWrapper.stopFullScreen();
         return true;
@@ -660,14 +667,21 @@ public abstract class BaseVideoController extends FrameLayout implements InterVi
 
     /**
      * 子类重写此方法并在其中更新控制器在不同播放器状态下的ui
+     * 普通模式,小窗口模式,正常模式三种其中一种
+     * MODE_NORMAL              普通模式
+     * MODE_FULL_SCREEN         全屏模式
+     * MODE_TINY_WINDOW         小屏模式
      */
     @CallSuper
-    protected void onPlayerStateChanged(int playerState) {
+    protected void onPlayerStateChanged(@ConstantKeys.PlayMode int playerState) {
         switch (playerState) {
             case ConstantKeys.PlayMode.MODE_NORMAL:
+                //视频正常播放是设置监听
                 if (mEnableOrientation) {
+                    //检查系统是否开启自动旋转
                     mOrientationHelper.enable();
                 } else {
+                    //取消监听
                     mOrientationHelper.disable();
                 }
                 if (hasCutout()) {
@@ -682,6 +696,7 @@ public abstract class BaseVideoController extends FrameLayout implements InterVi
                 }
                 break;
             case ConstantKeys.PlayMode.MODE_TINY_WINDOW:
+                //小窗口取消重力感应监听
                 mOrientationHelper.disable();
                 break;
         }

+ 4 - 2
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/controller/OrientationHelper.java

@@ -34,8 +34,10 @@ public class OrientationHelper extends OrientationEventListener {
     @Override
     public void onOrientationChanged(int orientation) {
         long currentTime = System.currentTimeMillis();
-        if (currentTime - mLastTime < 300) return;
-        //300毫秒检测一次
+        if (currentTime - mLastTime < 500) {
+            return;
+        }
+        //500毫秒检测一次
         if (mOnOrientationChangeListener != null) {
             mOnOrientationChangeListener.onOrientationChanged(orientation);
         }

+ 78 - 0
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/more/CustomNetworkView.java

@@ -0,0 +1,78 @@
+package org.yczbj.ycvideoplayerlib.ui.more;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.yczbj.ycvideoplayerlib.controller.ControlWrapper;
+import org.yczbj.ycvideoplayerlib.ui.view.InterControlView;
+
+/**
+ * <pre>
+ *     @author yangchong
+ *     blog  : https://github.com/yangchong211
+ *     time  : 2017/11/9
+ *     desc  : 网络变化提示对话框。当网络由wifi变为4g的时候会显示
+ *     revise:
+ * </pre>
+ */
+public class CustomNetworkView extends FrameLayout implements InterControlView, View.OnClickListener {
+
+    public CustomNetworkView(@NonNull Context context) {
+        super(context);
+    }
+
+    public CustomNetworkView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public CustomNetworkView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    public void attach(@NonNull ControlWrapper controlWrapper) {
+
+    }
+
+    @Override
+    public View getView() {
+        return null;
+    }
+
+    @Override
+    public void onVisibilityChanged(boolean isVisible, Animation anim) {
+
+    }
+
+    @Override
+    public void onPlayStateChanged(int playState) {
+
+    }
+
+    @Override
+    public void onPlayerStateChanged(int playerState) {
+
+    }
+
+    @Override
+    public void setProgress(int duration, int position) {
+
+    }
+
+    @Override
+    public void onLockStateChanged(boolean isLocked) {
+
+    }
+
+    @Override
+    public void onClick(View v) {
+
+    }
+
+}

+ 78 - 0
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/more/CustomTrailersView.java

@@ -0,0 +1,78 @@
+package org.yczbj.ycvideoplayerlib.ui.more;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.yczbj.ycvideoplayerlib.controller.ControlWrapper;
+import org.yczbj.ycvideoplayerlib.ui.view.InterControlView;
+
+/**
+ * <pre>
+ *     @author yangchong
+ *     blog  : https://github.com/yangchong211
+ *     time  : 2017/11/9
+ *     desc  : 试看
+ *     revise:
+ * </pre>
+ */
+public class CustomTrailersView extends FrameLayout implements InterControlView, View.OnClickListener {
+
+    public CustomTrailersView(@NonNull Context context) {
+        super(context);
+    }
+
+    public CustomTrailersView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public CustomTrailersView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    public void attach(@NonNull ControlWrapper controlWrapper) {
+
+    }
+
+    @Override
+    public View getView() {
+        return null;
+    }
+
+    @Override
+    public void onVisibilityChanged(boolean isVisible, Animation anim) {
+
+    }
+
+    @Override
+    public void onPlayStateChanged(int playState) {
+
+    }
+
+    @Override
+    public void onPlayerStateChanged(int playerState) {
+
+    }
+
+    @Override
+    public void setProgress(int duration, int position) {
+
+    }
+
+    @Override
+    public void onLockStateChanged(boolean isLocked) {
+
+    }
+
+    @Override
+    public void onClick(View v) {
+
+    }
+
+}

+ 6 - 0
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/view/BasisVideoController.java

@@ -15,6 +15,7 @@ limitations under the License.
 */
 package org.yczbj.ycvideoplayerlib.ui.view;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.util.AttributeSet;
@@ -286,6 +287,11 @@ public class BasisVideoController extends GestureVideoController implements View
         if (mControlWrapper.isFullScreen()) {
             return stopFullScreen();
         }
+        Activity activity = PlayerUtils.scanForActivity(getContext());
+        //如果不是全屏模式,则直接关闭页面activity
+        if (PlayerUtils.isActivityLiving(activity)){
+            activity.finish();
+        }
         return super.onBackPressed();
     }
 

+ 6 - 1
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/ui/view/CustomTitleView.java

@@ -78,7 +78,7 @@ public class CustomTitleView extends FrameLayout implements InterControlView, Vi
     private void init(Context context){
         this.mContext = context;
         setVisibility(GONE);
-        View view = LayoutInflater.from(getContext()).inflate(
+        View view = LayoutInflater.from(mContext).inflate(
                 R.layout.custom_video_player_top, this, true);
         initFindViewById(view);
         initListener();
@@ -107,6 +107,11 @@ public class CustomTitleView extends FrameLayout implements InterControlView, Vi
             if (activity != null && mControlWrapper.isFullScreen()) {
                 activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                 mControlWrapper.stopFullScreen();
+                return;
+            }
+            //如果不是全屏模式,则直接关闭页面activity
+            if (PlayerUtils.isActivityLiving(activity)){
+                activity.finish();
             }
         }
     }

+ 1 - 1
VideoPlayer/src/main/res/layout/custom_video_player_top.xml

@@ -3,7 +3,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
+    android:layout_height="match_parent"
     android:orientation="vertical">
 
     <LinearLayout