在使用Vitamio时,一般会使用Vitamio中自带的控制器MediaController。但是使用MediaPlayer时会有一个bug,就是当VideoView调用完setMediaController之后,会自动向上弹一小块区间,导致显示在VideoView上方的TextView显示不到屏幕上。如下图所示:
如上图所示,开始在VideoView上方有两个TextView控件,分别是红色和绿色字体,但是当设置MediaController之后,造成VideoView向上移动,两个TextView被遮住。
通过以下方式可以解决此问题:
MainActivity.java
package material.danny_jiang.com.vitamioplayerdemo;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
public class MainActivity extends AppCompatActivity {
public static final Uri videoUrl = Uri.parse("http://112.253.22.157/17/z/z/y/u/" +
"zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/" +
"D046015255134077DDB3ACA0D7E68D45.flv");
private static final String TAG = "345";
private VideoView videoView;
private TextView textCache;
private TextView textSpeed;
private MediaController controller;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
if (Vitamio.initialize(this)) {
videoView.setVideoURI(videoUrl);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
/*
* add media controller
*/
controller = new MediaController(MainActivity.this);
videoView.setMediaController(controller);
/*
* and set its position on screen
*/
controller.setAnchorView(videoView);
}
});
}
});
// controller = new MediaController(this);
// videoView.setMediaController(controller);
// controller.setAnchorView(videoView);
// controller.setMediaPlayer(videoView);
videoView.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
/**
*
* @param mp the MediaPlayer the update pertains to
* @param percent 视频缓冲的进度
*/
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.e(TAG, "onBufferingUpdate: percent is " + percent);
textCache.setText("已缓冲: " + percent + "%");
}
});
videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
/**
*
* @param mp the MediaPlayer the info pertains to.
* @param what 缓冲的提示信息
* @param extra 下载的速度提示
* @return
*/
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
//开始缓冲
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
Log.e(TAG, "onInfo: MEDIA_INFO_BUFFERING_START");
textCache.setVisibility(View.VISIBLE);
textSpeed.setVisibility(View.VISIBLE);
videoView.pause();
break;
//缓冲结束
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
Log.e(TAG, "onInfo: MEDIA_INFO_BUFFERING_END");
//textCache.setVisibility(View.INVISIBLE);
//textSpeed.setVisibility(View.INVISIBLE);
videoView.start();
break;
//下载速度发生改变
case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
Log.e(TAG, "onInfo: MEDIA_INFO_DOWNLOAD_RATE_CHANGED");
textSpeed.setText("下载速度: " + extra + "kb/s");
break;
}
return true;
}
});
videoView.start();
}
}
private void initViews() {
textCache = ((TextView) findViewById(R.id.cacheText));
textSpeed = ((TextView) findViewById(R.id.netSpeed));
videoView = ((VideoView) findViewById(R.id.videoView_Main));
videoView.setVideoLayout(VideoView.VIDEO_LAYOUT_STRETCH, 0);
}
}
设置VideoView的onPrepareListener,当监听到onPrepare方法之后动态设置onVideoViewSizeChanged监听器,当VideoView尺寸发生改变之后再设置MediaController