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);
}
- 设置外部布局的上下外边距的时候记得要减去标题栏高度,默认获取的屏幕高度是包含状态栏以及标题栏。
- 最后注意我们的坐标计算方式即可。