Kaynağa Gözat

修改悬浮view意外销毁导致崩溃bug

杨充 4 yıl önce
ebeveyn
işleme
acd0f5357f

+ 12 - 2
VideoPlayer/src/main/java/com/yc/video/controller/GestureVideoController.java

@@ -179,8 +179,10 @@ public abstract class GestureVideoController extends BaseVideoController impleme
     public boolean onDown(MotionEvent e) {
         if (!isInPlaybackState() //不处于播放状态
                 || !mIsGestureEnabled //关闭了手势
-                || PlayerUtils.isEdge(getContext(), e)) //处于屏幕边沿
+                || PlayerUtils.isEdge(getContext(), e)) {
+            //处于屏幕边沿
             return true;
+        }
         mStreamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
         Activity activity = PlayerUtils.scanForActivity(getContext());
         if (activity == null) {
@@ -222,6 +224,8 @@ public abstract class GestureVideoController extends BaseVideoController impleme
 
     /**
      * 在屏幕上滑动
+     * 左右滑动,则是改变播放进度
+     * 上下滑动,滑动左边改变音量;滑动右边改变亮度
      */
     @Override
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
@@ -229,13 +233,18 @@ public abstract class GestureVideoController extends BaseVideoController impleme
                 || !mIsGestureEnabled //关闭了手势
                 || !mCanSlide //关闭了滑动手势
                 || isLocked() //锁住了屏幕
-                || PlayerUtils.isEdge(getContext(), e1)) //处于屏幕边沿
+                //处于屏幕边沿
+                || PlayerUtils.isEdge(getContext(), e1)){
             return true;
+        }
         float deltaX = e1.getX() - e2.getX();
         float deltaY = e1.getY() - e2.getY();
+        //如果是第一次触摸
         if (mFirstTouch) {
+            //判断是左右滑动,还是上下滑动
             mChangePosition = Math.abs(distanceX) >= Math.abs(distanceY);
             if (!mChangePosition) {
+                //上下滑动,滑动左边改变音量;滑动右边改变亮度
                 //半屏宽度
                 if (mHalfScreen==0){
                     mHalfScreen = PlayerUtils.getScreenWidth(getContext(), true) / 2;
@@ -247,6 +256,7 @@ public abstract class GestureVideoController extends BaseVideoController impleme
                 }
             }
 
+            //左右滑动,则是改变播放进度
             if (mChangePosition) {
                 //根据用户设置是否可以滑动调节进度来决定最终是否可以滑动调节进度
                 mChangePosition = mCanChangePosition;

+ 43 - 4
VideoPlayer/src/main/java/com/yc/video/player/VideoPlayer.java

@@ -185,6 +185,18 @@ public class VideoPlayer<P extends AbstractVideoPlayer> extends FrameLayout
         VideoLogUtils.setIsLog(config.mIsEnableLog);
     }
 
+    /**
+     * onAttachedToWindow方法
+     * 是在Activity resume的时候被调用的,也就是activity对应的window被添加的时候,且每个view只会被调用一次,
+     * 父view的调用在前,不论view的visibility状态都会被调用,适合做些view特定的初始化操作;
+     *
+     * 主要做什么:适合初始化操作
+     *
+     * 代码流程:
+     * ActivityThread.handleResumeActivity()--->WindowManager.addView()--->WindowManagerImpl.addView()
+     * -->WindowManagerGlobal.addView()--->root.setView(view, wparams, panelParentView)
+     * --->host.dispatchAttachedToWindow()[具体代码在ViewRootImpl类中]
+     */
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
@@ -193,6 +205,18 @@ public class VideoPlayer<P extends AbstractVideoPlayer> extends FrameLayout
         //在构造函数初始化时addView
     }
 
+    /**
+     * onDetachedFromWindow方法
+     * 是在Activity destroy的时候被调用的,也就是activity对应的window被删除的时候,且每个view只会被调用一次,
+     * 父view的调用在后,也不论view的visibility状态都会被调用,适合做最后的清理操作;
+     *
+     * 主要做什么:适合销毁清理操作
+     *
+     * 代码流程:
+     * ActivityThread.handleDestroyActivity() --> WindowManager.removeViewImmediate() -->
+     * WindowManagerGlobal.removeViewLocked()方法 —> ViewRootImpl.die() --> doDie() -->
+     * ViewRootImpl.dispatchDetachedFromWindow()
+     */
     @Override
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
@@ -206,6 +230,10 @@ public class VideoPlayer<P extends AbstractVideoPlayer> extends FrameLayout
         release();
     }
 
+    /**
+     * View所在窗口获取焦点或者失去焦点时调用
+     * @param hasWindowFocus                        是否获取window焦点
+     */
     @Override
     public void onWindowFocusChanged(boolean hasWindowFocus) {
         super.onWindowFocusChanged(hasWindowFocus);
@@ -216,6 +244,18 @@ public class VideoPlayer<P extends AbstractVideoPlayer> extends FrameLayout
         }
     }
 
+    /**
+     * View在xml文件里加载完成时调用
+     */
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+    }
+
+    /**
+     * 意外销毁保存数据调用
+     * @return                              返回Parcelable对象
+     */
     @Override
     protected Parcelable onSaveInstanceState() {
         VideoLogUtils.d("onSaveInstanceState: " + mCurrentPosition);
@@ -240,8 +280,7 @@ public class VideoPlayer<P extends AbstractVideoPlayer> extends FrameLayout
         mPlayerContainer = new FrameLayout(getContext());
         //设置背景颜色,目前设置为纯黑色
         mPlayerContainer.setBackgroundColor(mPlayerBackgroundColor);
-        LayoutParams params = new LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
+        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.MATCH_PARENT);
         //将布局添加到该视图中
         this.addView(mPlayerContainer, params);
@@ -1113,8 +1152,8 @@ public class VideoPlayer<P extends AbstractVideoPlayer> extends FrameLayout
     }
 
 
-    /**-----------------------------暴露api方法--------------------------------------**/
-    /**-----------------------------暴露api方法--------------------------------------**/
+    /*-----------------------------暴露api方法--------------------------------------**/
+    /*-----------------------------暴露api方法--------------------------------------**/
 
 
     public void setVideoBuilder(VideoPlayerBuilder videoBuilder){

+ 17 - 0
VideoPlayer/src/main/java/com/yc/video/ui/view/CustomGestureView.java

@@ -116,6 +116,9 @@ public class CustomGestureView extends FrameLayout implements IGestureComponent
 
     }
 
+    /**
+     * 开始滑动
+     */
     @Override
     public void onStartSlide() {
         mControlWrapper.hide();
@@ -142,6 +145,12 @@ public class CustomGestureView extends FrameLayout implements IGestureComponent
                 .start();
     }
 
+    /**
+     * 滑动调整进度
+     * @param slidePosition 滑动进度
+     * @param currentPosition 当前播放进度
+     * @param duration 视频总长度
+     */
     @Override
     public void onPositionChange(int slidePosition, int currentPosition, int duration) {
         mProPercent.setVisibility(GONE);
@@ -153,6 +162,10 @@ public class CustomGestureView extends FrameLayout implements IGestureComponent
         mTvPercent.setText(String.format("%s/%s", PlayerUtils.formatTime(slidePosition), PlayerUtils.formatTime(duration)));
     }
 
+    /**
+     * 滑动调整亮度
+     * @param percent 亮度百分比
+     */
     @Override
     public void onBrightnessChange(int percent) {
         mProPercent.setVisibility(VISIBLE);
@@ -161,6 +174,10 @@ public class CustomGestureView extends FrameLayout implements IGestureComponent
         mProPercent.setProgress(percent);
     }
 
+    /**
+     * 滑动调整音量
+     * @param percent 音量百分比
+     */
     @Override
     public void onVolumeChange(int percent) {
         mProPercent.setVisibility(VISIBLE);

+ 1 - 1
VideoView/src/main/java/com/yc/videoview/FloatLifecycle.java

@@ -21,7 +21,7 @@ import androidx.annotation.RequiresApi;
  */
 
 @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
-class FloatLifecycle extends BroadcastReceiver implements Application.ActivityLifecycleCallbacks {
+public class FloatLifecycle extends BroadcastReceiver implements Application.ActivityLifecycleCallbacks {
 
     private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
     private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

+ 3 - 2
VideoView/src/main/java/com/yc/videoview/FloatPhone.java

@@ -13,7 +13,6 @@ import android.view.WindowManager;
 public class FloatPhone extends FloatView {
 
     private final Context mContext;
-
     private final WindowManager mWindowManager;
     private final WindowManager.LayoutParams mLayoutParams;
     private View mView;
@@ -79,7 +78,9 @@ public class FloatPhone extends FloatView {
 
     @Override
     public void dismiss() {
-        mWindowManager.removeView(mView);
+        if (mView!=null){
+            mWindowManager.removeView(mView);
+        }
     }
 
     @Override

+ 17 - 14
VideoView/src/main/java/com/yc/videoview/FloatToast.java

@@ -69,20 +69,23 @@ public class FloatToast extends FloatView {
             Field tnField = toast.getClass().getDeclaredField("mTN");
             tnField.setAccessible(true);
             mTN = tnField.get(toast);
-            show = mTN.getClass().getMethod("show");
-            hide = mTN.getClass().getMethod("hide");
-
-            Field tnParamsField = mTN.getClass().getDeclaredField("mParams");
-            tnParamsField.setAccessible(true);
-            WindowManager.LayoutParams params = (WindowManager.LayoutParams) tnParamsField.get(mTN);
-            params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
-            params.width = mWidth;
-            params.height = mHeight;
-            params.windowAnimations = 0;
-            Field tnNextViewField = mTN.getClass().getDeclaredField("mNextView");
-            tnNextViewField.setAccessible(true);
-            tnNextViewField.set(mTN, toast.getView());
+            if (mTN != null) {
+                show = mTN.getClass().getMethod("show");
+                hide = mTN.getClass().getMethod("hide");
+                Field tnParamsField = mTN.getClass().getDeclaredField("mParams");
+                tnParamsField.setAccessible(true);
+                WindowManager.LayoutParams params = (WindowManager.LayoutParams) tnParamsField.get(mTN);
+                if (params != null) {
+                    params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+                    params.width = mWidth;
+                    params.height = mHeight;
+                    params.windowAnimations = 0;
+                }
+                Field tnNextViewField = mTN.getClass().getDeclaredField("mNextView");
+                tnNextViewField.setAccessible(true);
+                tnNextViewField.set(mTN, toast.getView());
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 1 - 1
VideoView/src/main/java/com/yc/videoview/FloatView.java

@@ -3,7 +3,7 @@ package com.yc.videoview;
 import android.view.View;
 
 
-abstract class FloatView {
+public abstract class FloatView {
 
     abstract void setSize(int width, int height);
 

+ 24 - 20
VideoView/src/main/java/com/yc/videoview/FloatWindow.java

@@ -21,6 +21,11 @@ import java.util.Map;
  */
 public class FloatWindow {
 
+    /**
+     * 如果想要 Window 位于所有 Window 的最顶层,那么采用较大的层级即可,很显然系统 Window 的层级是最大的。
+     * 当我们采用系统层级时,一般选用TYPE_SYSTEM_ERROR或者TYPE_SYSTEM_OVERLAY,还需要声明权限。
+     * <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+     */
     private FloatWindow() {
 
     }
@@ -38,8 +43,8 @@ public class FloatWindow {
 
 
     @MainThread
-    public static B with(@NonNull Context applicationContext) {
-        return new B(applicationContext);
+    public static Builder with(@NonNull Context applicationContext) {
+        return new Builder(applicationContext);
     }
 
     public static void destroy() {
@@ -57,7 +62,7 @@ public class FloatWindow {
         mFloatWindowMap.remove(tag);
     }
 
-    public static class B {
+    public static class Builder {
         Context mApplicationContext;
         View mView;
         private int mLayoutId;
@@ -73,35 +78,35 @@ public class FloatWindow {
         TimeInterpolator mInterpolator;
         private String mTag = mDefaultTag;
 
-        private B() {
+        private Builder() {
 
         }
 
-        B(Context applicationContext) {
+        Builder(Context applicationContext) {
             mApplicationContext = applicationContext;
         }
 
-        public B setView(@NonNull View view) {
+        public Builder setView(@NonNull View view) {
             mView = view;
             return this;
         }
 
-        public B setView(@LayoutRes int layoutId) {
+        public Builder setView(@LayoutRes int layoutId) {
             mLayoutId = layoutId;
             return this;
         }
 
-        public B setWidth(int width) {
+        public Builder setWidth(int width) {
             mWidth = width;
             return this;
         }
 
-        public B setHeight(int height) {
+        public Builder setHeight(int height) {
             mHeight = height;
             return this;
         }
 
-        public B setWidth(@WindowScreen.screenType int screenType, float ratio) {
+        public Builder setWidth(@WindowScreen.screenType int screenType, float ratio) {
             mWidth = (int) ((screenType == WindowScreen.WIDTH ?
                     WindowUtil.getScreenWidth(mApplicationContext) :
                     WindowUtil.getScreenHeight(mApplicationContext)) * ratio);
@@ -109,7 +114,7 @@ public class FloatWindow {
         }
 
 
-        public B setHeight(@WindowScreen.screenType int screenType, float ratio) {
+        public Builder setHeight(@WindowScreen.screenType int screenType, float ratio) {
             mHeight = (int) ((screenType == WindowScreen.WIDTH ?
                     WindowUtil.getScreenWidth(mApplicationContext) :
                     WindowUtil.getScreenHeight(mApplicationContext)) * ratio);
@@ -117,24 +122,24 @@ public class FloatWindow {
         }
 
 
-        public B setX(int x) {
+        public Builder setX(int x) {
             xOffset = x;
             return this;
         }
 
-        public B setY(int y) {
+        public Builder setY(int y) {
             yOffset = y;
             return this;
         }
 
-        public B setX(@WindowScreen.screenType int screenType, float ratio) {
+        public Builder setX(@WindowScreen.screenType int screenType, float ratio) {
             xOffset = (int) ((screenType == WindowScreen.WIDTH ?
                     WindowUtil.getScreenWidth(mApplicationContext) :
                     WindowUtil.getScreenHeight(mApplicationContext)) * ratio);
             return this;
         }
 
-        public B setY(@WindowScreen.screenType int screenType, float ratio) {
+        public Builder setY(@WindowScreen.screenType int screenType, float ratio) {
             yOffset = (int) ((screenType == WindowScreen.WIDTH ?
                     WindowUtil.getScreenWidth(mApplicationContext) :
                     WindowUtil.getScreenHeight(mApplicationContext)) * ratio);
@@ -148,25 +153,24 @@ public class FloatWindow {
          * @param show        过滤类型,子类类型也会生效
          * @param activities  过滤界面
          */
-        public B setFilter(boolean show, @NonNull Class... activities) {
+        public Builder setFilter(boolean show, @NonNull Class... activities) {
             mShow = show;
             mActivities = activities;
             return this;
         }
 
-
-        public B setMoveType(@MoveType.MOVE_TYPE int moveType) {
+        public Builder setMoveType(@MoveType.MOVE_TYPE int moveType) {
             mMoveType = moveType;
             return this;
         }
 
-        public B setMoveStyle(long duration, @Nullable TimeInterpolator interpolator) {
+        public Builder setMoveStyle(long duration, @Nullable TimeInterpolator interpolator) {
             mDuration = duration;
             mInterpolator = interpolator;
             return this;
         }
 
-        public B setTag(@NonNull String tag) {
+        public Builder setTag(@NonNull String tag) {
             mTag = tag;
             return this;
         }

+ 79 - 67
VideoView/src/main/java/com/yc/videoview/IFloatWindowImpl.java

@@ -15,7 +15,7 @@ import android.view.animation.DecelerateInterpolator;
 public class IFloatWindowImpl extends IFloatWindow {
 
 
-    private FloatWindow.B mB;
+    private FloatWindow.Builder mB;
     private FloatView mFloatView;
     private FloatLifecycle mFloatLifecycle;
     private boolean isShow;
@@ -27,8 +27,9 @@ public class IFloatWindowImpl extends IFloatWindow {
 
     }
 
-    IFloatWindowImpl(FloatWindow.B b) {
+    IFloatWindowImpl(FloatWindow.Builder b) {
         mB = b;
+        //这一步相当于创建系统级的window,通过windowManager添加view并且展示
         if (mB.mMoveType == MoveType.fixed) {
             if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.N_MR1) {
                 mFloatView = new FloatPhone(b.mApplicationContext);
@@ -67,7 +68,9 @@ public class IFloatWindowImpl extends IFloatWindow {
             once = false;
             isShow = true;
         } else {
-            if (isShow) return;
+            if (isShow) {
+                return;
+            }
             getView().setVisibility(View.VISIBLE);
             isShow = true;
         }
@@ -137,7 +140,9 @@ public class IFloatWindowImpl extends IFloatWindow {
     }
 
     void postHide() {
-        if (once || !isShow) return;
+        if (once || !isShow) {
+            return;
+        }
         getView().post(new Runnable() {
             @Override
             public void run() {
@@ -158,73 +163,77 @@ public class IFloatWindowImpl extends IFloatWindow {
             case MoveType.free:
                 break;
             default:
-                getView().setOnTouchListener(new View.OnTouchListener() {
-                    float lastX, lastY, changeX, changeY;
-                    int newX, newY;
-
-                    @Override
-                    public boolean onTouch(View v, MotionEvent event) {
-
-                        switch (event.getAction()) {
-                            case MotionEvent.ACTION_DOWN:
-                                lastX = event.getRawX();
-                                lastY = event.getRawY();
-                                cancelAnimator();
-                                break;
-                            case MotionEvent.ACTION_MOVE:
-                                changeX = event.getRawX() - lastX;
-                                changeY = event.getRawY() - lastY;
-                                newX = (int) (mFloatView.getX() + changeX);
-                                newY = (int) (mFloatView.getY() + changeY);
-                                mFloatView.updateXY(newX, newY);
-                                lastX = event.getRawX();
-                                lastY = event.getRawY();
-                                break;
-                            case MotionEvent.ACTION_UP:
-                                switch (mB.mMoveType) {
-                                    case MoveType.slide:
-                                        int startX = mFloatView.getX();
-                                        int endX = (startX * 2 + v.getWidth() >
-                                                WindowUtil.getScreenWidth(mB.mApplicationContext)) ?
-                                                WindowUtil.getScreenWidth(mB.mApplicationContext) - v.getWidth() : 0;
-                                        mAnimator = ObjectAnimator.ofInt(startX, endX);
-                                        mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                                            @Override
-                                            public void onAnimationUpdate(ValueAnimator animation) {
-                                                int x = (int) animation.getAnimatedValue();
-                                                mFloatView.updateX(x);
-                                            }
-                                        });
-                                        startAnimator();
-                                        break;
-                                    case MoveType.back:
-                                        PropertyValuesHolder pvhX = PropertyValuesHolder.ofInt("x", mFloatView.getX(), mB.xOffset);
-                                        PropertyValuesHolder pvhY = PropertyValuesHolder.ofInt("y", mFloatView.getY(), mB.yOffset);
-                                        mAnimator = ObjectAnimator.ofPropertyValuesHolder(pvhX, pvhY);
-                                        mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                                            @Override
-                                            public void onAnimationUpdate(ValueAnimator animation) {
-                                                int x = (int) animation.getAnimatedValue("x");
-                                                int y = (int) animation.getAnimatedValue("y");
-                                                mFloatView.updateXY(x, y);
-                                            }
-                                        });
-                                        startAnimator();
-                                        break;
-                                        default:
-                                            break;
-                                }
-                                break;
-                                default:
-                                    break;
+                getView().setOnTouchListener(onTouchListener);
+                break;
+        }
+    }
 
-                        }
-                        return false;
+    private View.OnTouchListener onTouchListener = new View.OnTouchListener() {
+        float lastX, lastY, changeX, changeY;
+        int newX, newY;
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            switch (event.getAction()) {
+                case MotionEvent.ACTION_DOWN:
+                    lastX = event.getRawX();
+                    lastY = event.getRawY();
+                    cancelAnimator();
+                    break;
+                case MotionEvent.ACTION_MOVE:
+                    changeX = event.getRawX() - lastX;
+                    changeY = event.getRawY() - lastY;
+                    newX = (int) (mFloatView.getX() + changeX);
+                    newY = (int) (mFloatView.getY() + changeY);
+                    mFloatView.updateXY(newX, newY);
+                    lastX = event.getRawX();
+                    lastY = event.getRawY();
+                    break;
+                case MotionEvent.ACTION_UP:
+                    switch (mB.mMoveType) {
+                        case MoveType.slide:
+                            int startX = mFloatView.getX();
+                            int endX = (startX * 2 + v.getWidth() >
+                                    WindowUtil.getScreenWidth(mB.mApplicationContext)) ?
+                                    WindowUtil.getScreenWidth(mB.mApplicationContext) - v.getWidth() : 0;
+                            mAnimator = ObjectAnimator.ofInt(startX, endX);
+                            mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                                @Override
+                                public void onAnimationUpdate(ValueAnimator animation) {
+                                    int x = (int) animation.getAnimatedValue();
+                                    mFloatView.updateX(x);
+                                }
+                            });
+                            startAnimator();
+                            break;
+                        case MoveType.back:
+                            PropertyValuesHolder pvhX = PropertyValuesHolder.ofInt("x", mFloatView.getX(), mB.xOffset);
+                            PropertyValuesHolder pvhY = PropertyValuesHolder.ofInt("y", mFloatView.getY(), mB.yOffset);
+                            mAnimator = ObjectAnimator.ofPropertyValuesHolder(pvhX, pvhY);
+                            mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                                @Override
+                                public void onAnimationUpdate(ValueAnimator animation) {
+                                    int x = (int) animation.getAnimatedValue("x");
+                                    int y = (int) animation.getAnimatedValue("y");
+                                    mFloatView.updateXY(x, y);
+                                }
+                            });
+                            startAnimator();
+                            break;
+                        default:
+                            break;
                     }
-                });
+                    break;
+                default:
+                    break;
+
+            }
+            return false;
         }
-    }
+    };
 
+    /**
+     * 开启动画
+     */
     private void startAnimator() {
         if (mB.mInterpolator == null) {
             if (mDecelerateInterpolator == null) {
@@ -244,6 +253,9 @@ public class IFloatWindowImpl extends IFloatWindow {
         mAnimator.setDuration(mB.mDuration).start();
     }
 
+    /**
+     * 关闭动画
+     */
     private void cancelAnimator() {
         if (mAnimator != null && mAnimator.isRunning()) {
             mAnimator.cancel();

+ 0 - 28
VideoView/src/main/java/com/yc/videoview/MyLinearLayout.java

@@ -1,28 +0,0 @@
-package com.yc.videoview;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.widget.LinearLayout;
-
-import androidx.annotation.Nullable;
-
-
-public class MyLinearLayout extends LinearLayout {
-    public MyLinearLayout(Context context) {
-        super(context);
-    }
-
-    public MyLinearLayout(Context context, @Nullable AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public MyLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        return true;
-    }
-}

+ 1 - 1
VideoView/src/main/java/com/yc/videoview/WindowUtil.java

@@ -9,7 +9,7 @@ import android.view.WindowManager;
 import androidx.annotation.RequiresApi;
 
 
-public class WindowUtil {
+public final class WindowUtil {
 
 
     @RequiresApi(api = Build.VERSION_CODES.M)