MediaPlayer+surfaceView实现视频播放器

最近项目中要用到视频播放器,就先写了个Demo,在写的过程中遇到些问题,来和大家分享一下:

1.Demo是基于Android电视的,因此与Android手机有点区别,但问题不大

2.MediaPlayer有个Bug,当视频播放完后getDuration(获取视频总时间)和getCurrentPosition(获取视频当前播放时间)方法获取到的数字不一样,相差300ms左右,如果单纯的播放不受影响,但是如果需要显示播放进度或播放时间就会有点小麻烦,暂时还没找到好的方法,只能在视频播放结束时处理时间,如果你们有好的方法也可以交流一下。

3.项目要实现显示当前时间的TextView与进度条同步移动,界面添加一个ViewGroup,然后在ViewGroup中放置TextView,通过TextView的Layout方法就能实现TextView的同步移动。

代码的解析挺详细,下面我就直接粘代码:

主Activity:

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;

import com.example.play.R;
import com.luluvideo.view.TextMoveLayout;

import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.graphics.Color;
import android.graphics.Typeface;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

	private SurfaceView videoSurfaceView;// 视频播放器
	private MediaPlayer mediaPlayer;// 视频播放控制器
	private ImageView videoStart;// 播放
	private ImageView videoForward;// 快进
	private ImageView videoBack;// 快退
	private ImageView videoReport;// 举报视频
	private LinearLayout seekLayout;
	private LinearLayout videoProgress;
	private ProgressBar progressBar;// 视频进度条
	private TextView totalTime;// 播放总时间
	private View view;// 记忆获取焦点控件
	private TextView movieName;// 电影名字
	private TextView currentTime;// 当前播放时间
	private ViewGroup.LayoutParams layoutParams;
	private TextMoveLayout textMoveLayout;// 放置当前时间控件的ViewGroup

	private int screenWidth;// 屏幕宽度
	private Typeface roboto;// 自定义Roboto字体
	private float moveStep = 0;// 当前时间控件移动步长
	private SimpleDateFormat formatter;// 转换时间格式的类
	private SimpleDateFormat hourFormatter;
	private boolean isPlaying = true;// 视频播放状态标识
	private boolean isVisible = false;// 视频进度条隐藏或显示标识
	private boolean hourOrMin = false;
	private boolean threadRunning = true;
	private int postion = 0;
	private String uri = null;
	private AlphaAnimation animation_appear;// 进度条显现动画
	private AlphaAnimation animation_daiappear;// 进度条消失动画
	private float progressLength = 0;// 进度条相对长度
	private Thread thread = null;

	private MyTimerTask task;

	public static int PROGRESS_VISUBLE = 0;
	public static int PROGRESS_RATE = 1;

	public int i = 0;

	private Timer timer;

	/**
	 * 刷新进度条和当前时间
	 */
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			if (msg.what == PROGRESS_RATE) {
				// 显示进度条
				progressBar.setProgress((Integer) msg.obj);
				// 设置当前时间
				currentTime.layout((int) ((Integer) msg.obj * moveStep), 0,
						(int) (screenWidth), 80);
				if (hourOrMin) {
					currentTime
							.setText(hourFormatter.format((Integer) msg.obj));
				} else {
					currentTime.setText(formatter.format((Integer) msg.obj));
				}
			} else if (msg.what == PROGRESS_VISUBLE) {
				Log.e("timer", msg.obj + "");
				if ((Integer) msg.obj == 4) {

					view = getCurrentFocus();
					// videoProgress
					// .setAnimation(animationAppear(animation_appear));
					// videoProgress.setVisibility(View.GONE);
					seekLayout.setAnimation(animationAppear(animation_appear));
					seekLayout.setVisibility(View.GONE);
					isVisible = false;
					timer.cancel();
				}

			}
		}
	};

	@Overr
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值