Selaa lähdekoodia

视频列表悬浮窗播放视频

杨充 4 vuotta sitten
vanhempi
commit
c674c8bf5e

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

@@ -98,6 +98,9 @@
         <activity android:name="org.yczbj.ycvideoplayer.newPlayer.pip.PipActivity"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:screenOrientation="portrait"/>
+        <activity android:name="org.yczbj.ycvideoplayer.newPlayer.pip.PipListActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize"
+            android:screenOrientation="portrait"/>
     </application>
 
 </manifest>

+ 4 - 1
app/src/main/java/org/yczbj/ycvideoplayer/newPlayer/activity/TypeActivity.java

@@ -17,6 +17,7 @@ import org.yczbj.ycvideoplayer.newPlayer.danmu.DanmuActivity;
 import org.yczbj.ycvideoplayer.newPlayer.list.ListVideoActivity;
 import org.yczbj.ycvideoplayer.newPlayer.list.TestListActivity;
 import org.yczbj.ycvideoplayer.newPlayer.pip.PipActivity;
+import org.yczbj.ycvideoplayer.newPlayer.pip.PipListActivity;
 import org.yczbj.ycvideoplayer.newPlayer.surface.TestSurfaceActivity;
 import org.yczbj.ycvideoplayer.newPlayer.tiny.TestFullActivity;
 import org.yczbj.ycvideoplayer.newPlayer.tiny.TinyScreenActivity;
@@ -155,7 +156,9 @@ public class TypeActivity extends AppCompatActivity implements View.OnClickListe
             startActivity(new Intent(this,MultipleActivity.class));
         } else if (v == mTv41){
             startActivity(new Intent(this, PipActivity.class));
-        }  else if (v == mTv43){
+        } else if (v == mTv42){
+            startActivity(new Intent(this, PipListActivity.class));
+        }   else if (v == mTv43){
             startActivity(new Intent(this, TinyScreenActivity.class));
         } else if (v == mTv61){
             Intent intent = new Intent(this, TestListActivity.class);

+ 155 - 0
app/src/main/java/org/yczbj/ycvideoplayer/newPlayer/pip/PipListActivity.java

@@ -0,0 +1,155 @@
+package org.yczbj.ycvideoplayer.newPlayer.pip;
+
+import android.content.pm.ActivityInfo;
+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.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+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.pip.FloatVideoManager;
+import org.yczbj.ycvideoplayerlib.ui.view.BasisVideoController;
+
+import java.util.List;
+
+/**
+ * 悬浮播放终极版
+ */
+public class PipListActivity extends AppCompatActivity implements OnItemChildClickListener {
+
+    private FloatVideoManager mPIPManager;
+    private VideoPlayer mVideoView;
+    private BasisVideoController mController;
+    private List<VideoInfoBean> mVideos;
+    private LinearLayoutManager mLinearLayoutManager;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.base_recycler_view);
+        initView();
+    }
+
+    protected void initView() {
+        mPIPManager = FloatVideoManager.getInstance(this);
+        mVideoView = VideoViewManager.instance().get(FloatVideoManager.PIP);
+        mController = new BasisVideoController(this);
+        initRecyclerView();
+    }
+
+
+    private void initRecyclerView() {
+        RecyclerView recyclerView = findViewById(R.id.recyclerView);
+        mLinearLayoutManager = new LinearLayoutManager(this);
+        recyclerView.setLayoutManager(mLinearLayoutManager);
+        mVideos = ConstantVideo.getVideoList();
+        VideoRecyclerViewAdapter adapter = new VideoRecyclerViewAdapter(mVideos);
+        adapter.setOnItemChildClickListener(this);
+        recyclerView.setAdapter(adapter);
+        recyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
+            @Override
+            public void onChildViewAttachedToWindow(@NonNull View view) {
+                VideoRecyclerViewAdapter.VideoHolder holder = (VideoRecyclerViewAdapter.VideoHolder) view.getTag();
+                int position = holder.mPosition;
+                if (position == mPIPManager.getPlayingPosition()) {
+                    startPlay(position, false);
+                }
+            }
+
+            @Override
+            public void onChildViewDetachedFromWindow(@NonNull View view) {
+                VideoRecyclerViewAdapter.VideoHolder holder = (VideoRecyclerViewAdapter.VideoHolder) view.getTag();
+                int position = holder.mPosition;
+                if (position == mPIPManager.getPlayingPosition()) {
+                    startFloatWindow();
+                    mController.setPlayState(ConstantKeys.CurrentState.STATE_IDLE);
+                }
+            }
+        });
+    }
+
+    private void startFloatWindow() {
+        mPIPManager.startFloatWindow();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mPIPManager.pause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mPIPManager.resume();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mPIPManager.reset();
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (mPIPManager.onBackPress()) return;
+        super.onBackPressed();
+
+    }
+
+    @Override
+    public void onItemChildClick(int position) {
+        startPlay(position, true);
+    }
+
+    /**
+     * 开始播放
+     *
+     * @param position 列表位置
+     */
+    protected void startPlay(int position, boolean isRelease) {
+        if (mPIPManager.isStartFloatWindow())
+            mPIPManager.stopFloatWindow();
+        if (mPIPManager.getPlayingPosition() != -1 && isRelease) {
+            releaseVideoView();
+        }
+        VideoInfoBean videoBean = mVideos.get(position);
+        mVideoView.setUrl(videoBean.getVideoUrl());
+        View itemView = mLinearLayoutManager.findViewByPosition(position);
+        if (itemView == null) return;
+        //注意:要先设置控制才能去设置控制器的状态。
+        mVideoView.setVideoController(mController);
+        mController.setPlayState(mVideoView.getCurrentPlayState());
+
+        VideoRecyclerViewAdapter.VideoHolder viewHolder = (VideoRecyclerViewAdapter.VideoHolder) itemView.getTag();
+        //把列表中预置的PrepareView添加到控制器中,注意isPrivate此处只能为true。
+        mController.addControlComponent(viewHolder.mPrepareView, true);
+        PlayerUtils.removeViewFormParent(mVideoView);
+        viewHolder.mPlayerContainer.addView(mVideoView, 0);
+        mVideoView.start();
+        mPIPManager.setPlayingPosition(position);
+    }
+
+    private void releaseVideoView() {
+        mVideoView.release();
+        if (mVideoView.isFullScreen()) {
+            mVideoView.stopFullScreen();
+        }
+        if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
+            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        }
+        mPIPManager.setPlayingPosition(-1);
+    }
+}

+ 1 - 1
app/src/main/res/layout/activity_new.xml

@@ -140,7 +140,7 @@
                 android:layout_marginTop="10dp"
                 android:padding="10dp"
                 android:background="@color/colorAccent"
-                android:text="4.2 全局视频悬浮窗,可以拖动"/>
+                android:text="4.2 视频列表中自动悬浮播放视频"/>
             <TextView
                 android:id="@+id/tv_4_3"
                 android:layout_width="match_parent"