Bläddra i källkod

优化视频播放器api

杨充 5 år sedan
förälder
incheckning
7fa0956111

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

@@ -38,7 +38,7 @@ import java.util.Map;
  * 5.锁定状态改变: {@link #handleLockStateChanged(boolean)}
  * 6.设备方向监听: {@link #onOrientationChanged(int)}
  */
-public abstract class BaseVideoController extends FrameLayout implements IVideoController,
+public abstract class BaseVideoController extends FrameLayout implements InterVideoController,
         OrientationHelper.OnOrientationChangeListener {
 
     //播放器包装类,集合了MediaPlayerControl的api和IVideoController的api

+ 8 - 3
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/controller/ControlWrapper.java

@@ -10,12 +10,12 @@ import androidx.annotation.NonNull;
  * 此类的目的是为了在ControlComponent中既能调用VideoView的api又能调用BaseVideoController的api,
  * 并对部分api做了封装,方便使用
  */
-public class ControlWrapper implements MediaPlayerControl, IVideoController {
+public class ControlWrapper implements MediaPlayerControl, InterVideoController {
     
     private MediaPlayerControl mPlayerControl;
-    private IVideoController mController;
+    private InterVideoController mController;
     
-    public ControlWrapper(@NonNull MediaPlayerControl playerControl, @NonNull IVideoController controller) {
+    public ControlWrapper(@NonNull MediaPlayerControl playerControl, @NonNull InterVideoController controller) {
         mPlayerControl = playerControl;
         mController = controller;
     }
@@ -254,6 +254,11 @@ public class ControlWrapper implements MediaPlayerControl, IVideoController {
         return mController.getCutoutHeight();
     }
 
+    @Override
+    public void destroy() {
+        mController.destroy();
+    }
+
     /**
      * 切换锁定状态
      */

+ 0 - 60
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/controller/IVideoController.java

@@ -1,60 +0,0 @@
-package org.yczbj.ycvideoplayerlib.controller;
-
-public interface IVideoController {
-
-    /**
-     * 开始控制视图自动隐藏倒计时
-     */
-    void startFadeOut();
-
-    /**
-     * 取消控制视图自动隐藏倒计时
-     */
-    void stopFadeOut();
-
-    /**
-     * 控制视图是否处于显示状态
-     */
-    boolean isShowing();
-
-    /**
-     * 设置锁定状态
-     * @param locked 是否锁定
-     */
-    void setLocked(boolean locked);
-
-    /**
-     * 是否处于锁定状态
-     */
-    boolean isLocked();
-
-    /**
-     * 开始刷新进度
-     */
-    void startProgress();
-
-    /**
-     * 停止刷新进度
-     */
-    void stopProgress();
-
-    /**
-     * 显示控制视图
-     */
-    void hide();
-
-    /**
-     * 隐藏控制视图
-     */
-    void show();
-
-    /**
-     * 是否需要适配刘海
-     */
-    boolean hasCutout();
-
-    /**
-     * 获取刘海的高度
-     */
-    int getCutoutHeight();
-}

+ 89 - 0
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/controller/InterVideoController.java

@@ -0,0 +1,89 @@
+/*
+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 org.yczbj.ycvideoplayerlib.controller;
+
+/**
+ * <pre>
+ *     @author yangchong
+ *     blog  : https://github.com/yangchong211
+ *     time  : 2017/11/21
+ *     desc  : 视频控制器接口
+ *     revise: 定义一些设置视图属性接口
+ * </pre>
+ */
+public interface InterVideoController {
+
+    /**
+     * 开始控制视图自动隐藏倒计时
+     */
+    void startFadeOut();
+
+    /**
+     * 取消控制视图自动隐藏倒计时
+     */
+    void stopFadeOut();
+
+    /**
+     * 控制视图是否处于显示状态
+     */
+    boolean isShowing();
+
+    /**
+     * 设置锁定状态
+     * @param locked 是否锁定
+     */
+    void setLocked(boolean locked);
+
+    /**
+     * 是否处于锁定状态
+     */
+    boolean isLocked();
+
+    /**
+     * 开始刷新进度
+     */
+    void startProgress();
+
+    /**
+     * 停止刷新进度
+     */
+    void stopProgress();
+
+    /**
+     * 显示控制视图
+     */
+    void hide();
+
+    /**
+     * 隐藏控制视图
+     */
+    void show();
+
+    /**
+     * 是否需要适配刘海
+     */
+    boolean hasCutout();
+
+    /**
+     * 获取刘海的高度
+     */
+    int getCutoutHeight();
+
+    /**
+     * 控制器意外销毁,比如手动退出,意外崩溃等等
+     */
+    void destroy();
+}

+ 4 - 4
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/inter/player/InterVideoController.java → VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/inter/player/InterVideoController2.java

@@ -15,10 +15,10 @@ limitations under the License.
 */
 package org.yczbj.ycvideoplayerlib.inter.player;
 
-import androidx.annotation.DrawableRes;
-
 import android.widget.ImageView;
 
+import androidx.annotation.DrawableRes;
+
 import org.yczbj.ycvideoplayerlib.config.ConstantKeys;
 
 /**
@@ -30,7 +30,7 @@ import org.yczbj.ycvideoplayerlib.config.ConstantKeys;
  *     revise: 定义一些设置视图属性接口
  * </pre>
  */
-public interface InterVideoController {
+public interface InterVideoController2 {
 
 
     /**
@@ -44,7 +44,7 @@ public interface InterVideoController {
      * @param isVisibility1                 tv图标是否显示
      * @param isVisibility2                 audio图标是否显示
      */
-    void setTvAndAudioVisibility(boolean isVisibility1 , boolean isVisibility2);
+    void setTvAndAudioVisibility(boolean isVisibility1, boolean isVisibility2);
 
     /**
      * 视频底图

+ 51 - 9
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/player/video/VideoPlayer.java

@@ -10,6 +10,9 @@ import android.graphics.Color;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Parcelable;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import android.text.TextUtils;
@@ -171,25 +174,43 @@ public class VideoPlayer<P extends AbstractPlayer> extends FrameLayout
         initView();
     }
 
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        VideoLogUtils.d("onAttachedToWindow");
+        //init();
+        //在构造函数初始化时addView
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        VideoLogUtils.d("onDetachedFromWindow");
+        if (mVideoController!=null){
+            mVideoController.destroy();
+        }
+        //onDetachedFromWindow方法是在Activity destroy的时候被调用的,也就是act对应的window被删除的时候,
+        //且每个view只会被调用一次,父view的调用在后,也不论view的visibility状态都会被调用,适合做最后的清理操作
+        //防止开发者没有在onDestroy中没有做销毁视频的优化
+        release();
+    }
+
+
     /**
      * 初始化播放器视图
      */
     protected void initView() {
         mPlayerContainer = new FrameLayout(getContext());
+        //设置背景颜色,目前设置为纯黑色
         mPlayerContainer.setBackgroundColor(mPlayerBackgroundColor);
         LayoutParams params = new LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.MATCH_PARENT);
+        //将布局添加到该视图中
         this.addView(mPlayerContainer, params);
     }
 
-    /**
-     * 设置{@link #mPlayerContainer}的背景色
-     */
-    public void setPlayerBackgroundColor(int color) {
-        mPlayerContainer.setBackgroundColor(color);
-    }
-
     /**
      * 开始播放,注意:调用此方法后必须调用{@link #release()}释放播放器,否则会导致内存泄漏
      */
@@ -204,8 +225,9 @@ public class VideoPlayer<P extends AbstractPlayer> extends FrameLayout
         }
         if (isStarted) {
             mPlayerContainer.setKeepScreenOn(true);
-            if (mAudioFocusHelper != null)
+            if (mAudioFocusHelper != null){
                 mAudioFocusHelper.requestFocus();
+            }
         }
     }
 
@@ -239,7 +261,9 @@ public class VideoPlayer<P extends AbstractPlayer> extends FrameLayout
      */
     protected boolean showNetWarning() {
         //播放本地数据源时不检测网络
-        if (isLocalDataSource()) return false;
+        if (isLocalDataSource()){
+            return false;
+        }
         return mVideoController != null && mVideoController.showNetWarning();
     }
 
@@ -1077,4 +1101,22 @@ public class VideoPlayer<P extends AbstractPlayer> extends FrameLayout
         saveProgress();
         return super.onSaveInstanceState();
     }
+
+
+    /**-----------------------------暴露api方法--------------------------------------**/
+    /**-----------------------------暴露api方法--------------------------------------**/
+
+    /**
+     * 设置视频播放器的背景色
+     */
+    public void setPlayerBackgroundColor(@ColorInt int color) {
+        //使用注解限定福
+        if (color==0){
+            mPlayerContainer.setBackgroundColor(Color.BLACK);
+        } else {
+            mPlayerContainer.setBackgroundColor(color);
+        }
+    }
+
+
 }

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

@@ -275,4 +275,9 @@ public class BasisVideoController extends GestureVideoController implements View
     public ImageView getThumb() {
         return thumb;
     }
+
+    @Override
+    public void destroy() {
+
+    }
 }

+ 2 - 3
VideoPlayer/src/main/java/org/yczbj/ycvideoplayerlib/view/controller/AbsVideoPlayerController.java

@@ -20,8 +20,7 @@ import android.content.Context;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.WindowManager;
-
-import org.yczbj.ycvideoplayerlib.inter.player.InterVideoController;
+import org.yczbj.ycvideoplayerlib.inter.player.InterVideoController2;
 import org.yczbj.ycvideoplayerlib.inter.player.VideoControllerView;
 import org.yczbj.ycvideoplayerlib.view.player.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.tool.utils.PlayerUtils;
@@ -40,7 +39,7 @@ import java.util.TimerTask;
  * </pre>
  */
 public abstract class AbsVideoPlayerController extends VideoControllerView implements
-        View.OnTouchListener, InterVideoController {
+        View.OnTouchListener, InterVideoController2 {
 
     private Context mContext;
     protected VideoPlayer mVideoPlayer;

+ 8 - 0
app/src/main/java/org/yczbj/ycvideoplayer/activity/NormalActivity.java

@@ -1,5 +1,6 @@
 package org.yczbj.ycvideoplayer.activity;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
@@ -107,4 +108,11 @@ public class NormalActivity extends AppCompatActivity implements View.OnClickLis
 
         }
     }
+
+    private void test(){
+        //VideoPlayer相关
+        //设置视频播放器的背景色
+        mVideoPlayer.setPlayerBackgroundColor(Color.BLACK);
+    }
+
 }