universalvideoview之拖拽播放视频控件

universalvideoview

一款简单易用的视频播放控件
怎么实现视频拖拽控件开发的?
思路如下:
继承framlayout,重写坐标监听方法。
思路很简单,贴出相关代码。

布局代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/video_layout"
    android:layout_width="300dp"
    android:layout_height="200dp"
    android:background="@android:color/black">
    <com.universalvideoview.UniversalVideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        app:uvv_autoRotation="true"
        app:uvv_fitXY="false" />

    <com.universalvideoview.UniversalMediaController
        android:id="@+id/media_controller"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:uvv_scalable="true" />
</FrameLayout>

java代码:

public class VideodragView extends FrameLayout implements View.OnTouchListener,UniversalVideoView.VideoViewCallback{
    private Context context;
    private View view;
    private LayoutInflater inflater;
    private int mScreenWidth, mScreenHeight; //屏幕宽高
    private float mOriginalX, mOriginalY;//手指按下时的初始位置
    private float mDistanceX, mDistanceY;//记录手指与view的左上角的距离
    private int left, top, right, bottom;
    private LayoutParams videodragviewLineParams,videoviewParams;
    private FrameLayout videoLayout;
    private UniversalVideoView videoView;
    private UniversalMediaController mediaController;
    private int mSeekPosition; //播放进度
    private boolean isFullscreen;//是否全屏
    private static final String VIDEO_URL = "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4";

    public VideodragView(Context context) {
        super(context);
    }

    public VideodragView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public VideodragView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        if (this.context == null) {
            this.context = context;
        }
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.videodragview, this, true);
        initView();
        WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        mScreenWidth = wm.getDefaultDisplay().getWidth();
        mScreenHeight = wm.getDefaultDisplay().getHeight();
        //加载一次位置,默认初始化位置位于左上角
        loadLocal(Integer.MAX_VALUE, 10);
    }

    private void loadLocal(int left, int top) {
        //保证小窗口大小不超过屏幕范围
        if (left > mScreenWidth - MeasureUtils.dip2px(context, 300)) {
            //left = mScreenWidth - MeasureUtils.dip2px(context, 300);
            left=0;
        }
        if (top > mScreenHeight - MeasureUtils.dip2px(context, 285) - MeasureUtils.getStatusBarHeight(context)) {
            top = mScreenHeight - MeasureUtils.dip2px(context, 285) - MeasureUtils.getStatusBarHeight(context);
        }
        videodragviewLineParams = (LayoutParams) videoLayout.getLayoutParams();
        videoviewParams = (LayoutParams) videoView.getLayoutParams();
        videodragviewLineParams.leftMargin = left;
        videodragviewLineParams.topMargin = top;
        videoLayout.setLayoutParams(videodragviewLineParams);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mOriginalX = event.getRawX();
                mOriginalY = event.getRawY();
                mDistanceX = event.getRawX() - videoLayout.getLeft();
                mDistanceY = event.getRawY() - videoLayout.getTop();
                break;
            case MotionEvent.ACTION_MOVE:
                left = (int) (event.getRawX() - mDistanceX);
                top = (int) (event.getRawY() - mDistanceY);
                right = left + v.getWidth();
                bottom = top + v.getHeight();
                if (left < 0) {
                    left = 0;
                    right = left + v.getWidth();
                }
                if (top < 0) {
                    top = 0;
                    bottom = top + v.getHeight();
                }
                if (right > mScreenWidth) {
                    right = mScreenWidth;
                    left = right - v.getWidth();
                }
                if (bottom > mScreenHeight) {
                    bottom = mScreenHeight;
                    top = bottom - v.getHeight();
                }
                //   v.layout(left, top, right, bottom);
                loadLocal(left, top);
                break;
            case MotionEvent.ACTION_UP:
                //消除警告
                v.performClick();
                break;
        }
        return true;
    }

    private void initView() {
        //视频播放框架
        videoLayout = (FrameLayout) findViewById(R.id.video_layout);
        videoView = (UniversalVideoView) findViewById(R.id.videoView);
        mediaController = (UniversalMediaController) findViewById(R.id.media_controller);
        videoView.setMediaController(mediaController);
       // mediaController.setMediaPlayer(videoView);
        mediaController.setOnTouchListener(this);
        mediaController.setTag(false);
        mediaController.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaController.setTag(!(boolean)mediaController.getTag());
                if (!(boolean)mediaController.getTag()){
                    mediaController.show();
                }else{
                    mediaController.hide();
                }
            }
        });
        videoView.setVideoViewCallback(this);
        videoView.setVideoPath(VIDEO_URL);
        videoView.requestFocus();
        videoView.start();

    }


    @Override
    public void onScaleChange(final boolean isFullscreen) {
        this.isFullscreen=isFullscreen;
        videoLayout.post(new Runnable() {
            @Override
            public void run() {
                if (isFullscreen) {
                    loadLocal(0,0);
                    //设置外部布局大小
                    videodragviewLineParams.width = mScreenWidth;
                    videodragviewLineParams.height = mScreenHeight - MeasureUtils.dip2px(context, 85) - MeasureUtils.getStatusBarHeight(context);
                    videoLayout.setLayoutParams(videodragviewLineParams);
                    //设置内部videoview布局大小
                    videoviewParams.width = mScreenWidth;
                    videoviewParams.height = mScreenHeight - MeasureUtils.dip2px(context, 85) - MeasureUtils.getStatusBarHeight(context);
                    videoView.setLayoutParams(videoviewParams);
                } else {
                    loadLocal(Integer.MAX_VALUE,10);
                    videodragviewLineParams.width = MeasureUtils.dip2px(context,300);
                    videodragviewLineParams.height = MeasureUtils.dip2px(context,200);
                    videoView.setLayoutParams(videodragviewLineParams);
                    videoviewParams.width = MeasureUtils.dip2px(context,300);
                    videoviewParams.height = MeasureUtils.dip2px(context,200);
                    videoView.setLayoutParams(videoviewParams);
                }
            }
        });
    }

    @Override
    public void onPause(MediaPlayer mediaPlayer) {
        if (videoView != null && videoView.isPlaying()) {
            mSeekPosition = videoView.getCurrentPosition();
            videoView.pause();
        }
    }

    @Override
    public void onStart(MediaPlayer mediaPlayer) {

    }

    @Override
    public void onBufferingStart(MediaPlayer mediaPlayer) {

    }

    @Override
    public void onBufferingEnd(MediaPlayer mediaPlayer) {

    }

}

注意问题如下:

  • 记得要videoView.setMediaController(mediaController); viewdeoview与mediacontroller绑定。
  • 监听拖拽要监听mediaController对象,因为它才在最上层,不然监听无效。
  • 缩放要注意,除了改变外部layout的大小以外,同时要改变videoview的大小。
  • 缩小注意,默认框架放大为横屏模式,缩小为竖屏模式,所以请把源码中的代码注销掉,改为默认横屏。
    代码如下:
    默认有俩个这样的方法,最后调用的都是第二个方法。
 void setFullscreen(boolean fullscreen);

 void setFullscreen(boolean fullscreen, int screenOrientation);
这里是我已经注销,默认使用横屏模式。
    public void setFullscreen(boolean fullscreen) {
//        int screenOrientation = fullscreen ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
//                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
//        setFullscreen(fullscreen, screenOrientation);
        setFullscreen(fullscreen,ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
  • 设置外部布局的上下外边距的时候记得要减去标题栏高度,默认获取的屏幕高度是包含状态栏以及标题栏。
  • 最后注意我们的坐标计算方式即可。
发布了20 篇原创文章 · 获赞 3 · 访问量 428

猜你喜欢

转载自blog.csdn.net/weixin_41078100/article/details/104326900
今日推荐