Introducción
La forma más fácil de reproducir video en Android es usar VideoView incorporado en el SDK y luego agregar MediaController para controlar la pausa de reproducción de video, etc., pero esto tiene la desventaja de que no puede personalizar su propia interfaz de usuario de control, así que aquí es un control de reproducción personalizado. Puede establecer una variedad de atributos personalizados (como estilo de carga, video de error, etc.), y es fácil cambiar entre pantalla completa y pantalla no completa, y es compatible con Android V2.3 y superior sistemas.
usar
- Enlace de descarga: https://github.com/linsea/UniversalVideoView
- compile 'com.linsea: universalvideoview: 1.1.0@aar'
Caso de estudio
package com.example.dell.myapplication;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.universalvideoview.UniversalMediaController;
import com.universalvideoview.UniversalVideoView;
public class MainActivity extends Activity implements UniversalVideoView.VideoViewCallback{
private static final String TAG = "MainActivity";
private static final String SEEK_POSITION_KEY = "SEEK_POSITION_KEY";
private static final String VIDEO_URL = "https://vfx.mtime.cn/Video/2016/11/07/mp4/161107094111718495_480.mp4";
UniversalVideoView mVideoView;
UniversalMediaController mMediaController;
View mBottomLayout;
View mVideoLayout;
TextView mStart;
private int mSeekPosition;
private int cachedHeight;
private boolean isFullscreen;
private TextView tv_title;
private LinearLayout titlebar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_universalvideoview);
tv_title = (TextView) findViewById(R.id.tv_title);
titlebar = (LinearLayout) findViewById(R.id.titlebar);
tv_title.setText("UniversalVideoView");
mVideoLayout = findViewById(R.id.video_layout);
mBottomLayout = findViewById(R.id.bottom_layout);
mVideoView = (UniversalVideoView) findViewById(R.id.videoView);
mMediaController = (UniversalMediaController) findViewById(R.id.media_controller);
mVideoView.setMediaController(mMediaController);
//设置播放屏幕模式和设置播放地址
setVideoAreaSize();
//设置屏幕状态和播放状态的监听
mVideoView.setVideoViewCallback(this);
mStart = (TextView) findViewById(R.id.start);
mStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSeekPosition > 0) {
mVideoView.seekTo(mSeekPosition);
}
mVideoView.start();
mMediaController.setTitle("Big Buck Bunny");
}
});
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.d(TAG, "onCompletion ");
}
});
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (mSeekPosition > 0) {
mVideoView.seekTo(mSeekPosition);
}
mVideoView.start();
}
});
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause ");
if (mVideoView != null && mVideoView.isPlaying()) {
mSeekPosition = mVideoView.getCurrentPosition();
Log.d(TAG, "onPause mSeekPosition=" + mSeekPosition);
mVideoView.pause();
}
}
/**
* 置视频区域大小
*/
private void setVideoAreaSize() {
mVideoLayout.post(new Runnable() {
@Override
public void run() {
int width = mVideoLayout.getWidth();
cachedHeight = (int) (width * 405f / 720f);
// cachedHeight = (int) (width * 3f / 4f);
// cachedHeight = (int) (width * 9f / 16f);
ViewGroup.LayoutParams videoLayoutParams = mVideoLayout.getLayoutParams();
videoLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
videoLayoutParams.height = cachedHeight;
mVideoLayout.setLayoutParams(videoLayoutParams);
mVideoView.setVideoPath(VIDEO_URL);
mVideoView.requestFocus();
}
});
}
//当屏幕发生改变的时候,如果要保持进度必须自己重写onSaveInstanceState方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState Position=" + mVideoView.getCurrentPosition());
outState.putInt(SEEK_POSITION_KEY, mSeekPosition);
}
@Override
protected void onRestoreInstanceState(Bundle outState) {
super.onRestoreInstanceState(outState);
mSeekPosition = outState.getInt(SEEK_POSITION_KEY);
Log.d(TAG, "onRestoreInstanceState Position=" + mSeekPosition);
}
/**
* 全屏和默认的切换
* @param isFullscreen
*/
@Override
public void onScaleChange(boolean isFullscreen) {
this.isFullscreen = isFullscreen;
if (isFullscreen) {
ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
mVideoLayout.setLayoutParams(layoutParams);
mBottomLayout.setVisibility(View.GONE);
//全屏就隐藏标题栏
titlebar.setVisibility(View.GONE);
} else {
ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
layoutParams.height = this.cachedHeight;
mVideoLayout.setLayoutParams(layoutParams);
mBottomLayout.setVisibility(View.VISIBLE);
//竖直方法的时候,显示标题栏
titlebar.setVisibility(View.VISIBLE);
}
// switchTitleBar(!isFullscreen);
}
// private void switchTitleBar(boolean show) {
// android.support.v7.app.ActionBar supportActionBar = getSupportActionBar();
// if (supportActionBar != null) {
// if (show) {
// supportActionBar.show();
// } else {
// supportActionBar.hide();
// }
// }
// }
@Override
public void onPause(MediaPlayer mediaPlayer) {
Log.d(TAG, "onPause UniversalVideoView callback");
}
@Override
public void onStart(MediaPlayer mediaPlayer) {
Log.d(TAG, "onStart UniversalVideoView callback");
}
@Override
public void onBufferingStart(MediaPlayer mediaPlayer) {
Log.d(TAG, "onBufferingStart UniversalVideoView callback");
}
@Override
public void onBufferingEnd(MediaPlayer mediaPlayer) {
Log.d(TAG, "onBufferingEnd UniversalVideoView callback");
}
@Override
public void onBackPressed() {
if (this.isFullscreen) {
mVideoView.setFullscreen(false);
} else {
super.onBackPressed();
}
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/titlebar" />
<FrameLayout
android:id="@+id/video_layout"
android:layout_width="fill_parent"
android:layout_height="200dp"
android:background="@android:color/black">
<com.universalvideoview.UniversalVideoView
android:id="@+id/videoView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
app:uvv_autoRotation="true"
app:uvv_fitXY="false" />
<com.universalvideoview.UniversalMediaController
android:id="@+id/media_controller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:uvv_scalable="true" />
</FrameLayout>
<LinearLayout
android:id="@+id/bottom_layout"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<Button
android:id="@+id/start"
android:layout_margin="5dp"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:background="@color/uvv_green"
android:gravity="center"
android:text="start" />
<TextView
android:id="@+id/introduction"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:text="this is video introduciton ......"
android:background="@color/uvv_gray" />
</LinearLayout>
</LinearLayout>