在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android 视频播放器

android 视频播放器

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:2.49M
  • 下载次数:193
  • 浏览次数:5082
  • 发布时间:2016-09-21
  • 实例类别:Android平台开发
  • 发 布 人:nuanse763
  • 文件格式:.rar
  • 所需积分:2
 相关标签: Android c d oa t

实例介绍

【实例简介】支持滑动改变音量 亮度 快进快退功能

【实例截图】

【核心代码】

package com.wyw.activity;

import java.io.File;
import java.util.ArrayList;

import com.wyw.videodemo.R;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.ThumbnailUtils;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore.Video.Thumbnails;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;

/**
 * 视频播放界面
 * 
 * @author WangYuWen
 * @version 1.0
 * @date 2015年3月5日
 * @Copyright: Copyright (c) 2014 Shenzhen Utoow Technology Co., Ltd. All rights
 *             reserved.
 */
public class MainActivity extends BaseActivity {

	/** 右边列表控件 */
	private ListView listview;
	/** 右边缩放控件 */
	private RelativeLayout right_relative;
	/** 上一首 */
	private ImageView img_last;
	/** 下一首 */
	private ImageView img_next;
	/** 播放 */
	private ImageView img_start;
	/** 全屏播放 */
	private ImageView img_full;
	/** 加减声音 */
	private ImageView img_voice;
	/** 列表适配器 */
	private VideoListAdapter adapter;
	/** 列表集合 */
	private ArrayList<VideoListBean> list;
	/** 播放视频的背景图片 */
	private ImageView video_img;

	/** 亮度或者声音的图片 */
	private ImageView img_center;
	/** 调节进度 */
	private ImageView img_pres_white;
	/** 底部视图栏 */
	private RelativeLayout buttom_relative;

	private View view;

	private FullVideoView video_VideoView;
	/** 当前播放时间 */
	private TextView txt_current_time;
	/** 总时间 */
	private TextView txt_max_time;
	/** 当前播放进度 */
	private ImageView img_white;
	/** 播放进度背景 */
	private ImageView img_bg;
	/** 拖放进度 */
	private ImageView img_center_speed;

	private AudioManager mAudioManager;
	/** 最大音量 */
	private int mMaxVolume;
	/** 当前声音 */
	private int mVolume = -1;
	/** 当前亮度 */
	private float mBrightness = -1f;
	/** 屏幕宽度 */
	private int width;
	/** 屏幕高度 */
	private int height;
	/** 手势 */
	private GestureDetector mGestureDetector;
	/** 视频总长度 */
	private long mVideo_total_length;
	/** 视频当前长度 */
	private long mVideo_current_length;
	/** 按下手势时的X点 */
	private float downX = 0;
	/** 按下手势时的Y点 */
	private float downY = 0;
	/** 移动手势时的Y点 */
	private float moveY = 0;
	/** 移动手势时的X点 */
	private float moveX = 0;
	/** 记录上一次移动手势时的X点 */
	private float OldMoveX = 0;
	/** 记录上一次移动手势时的y点 */
	private float OldMoveY = 0;
	/** 双数才执行(在用到的地方有详细的解释) */
	private int evens = 0;

	/** 是否显示全屏 */
	private boolean isVH = true;
	/** 是否快进了 */
	private boolean isVideo = false;
	/** 是否调节了音量 */
	private boolean isVoice = false;
	/** 是否调节了亮度 */
	private boolean isBright = false;
	/** 是否点击了开始播放 */
	private boolean isStart = false;
	/** 当前播放位置 */
	private int index_position = 0;

	private static final int handKey = 123;

	/** 视频路径 这是视频本地路径,资源的话你们自己去找,文件夹有创建,*/
	private String Path = Environment.getExternalStorageDirectory()   "/wywVideo/";

	@Override
	protected int getContentViewId() {
		return R.layout.activity_video_list;
	}

	@SuppressWarnings("deprecation")
	@Override
	protected void findViews() {
		img_last = (ImageView) findViewById(R.id.video_img_last);
		img_start = (ImageView) findViewById(R.id.video_img_start);
		img_next = (ImageView) findViewById(R.id.video_img_next);
		img_full = (ImageView) findViewById(R.id.video_img_full);
		img_voice = (ImageView) findViewById(R.id.video_img_voice);
		video_img = (ImageView) findViewById(R.id.video_img);

		img_center = (ImageView) findViewById(R.id.video_img_center);
		img_pres_white = (ImageView) findViewById(R.id.video_img_pres_front);

		txt_current_time = (TextView) findViewById(R.id.video_txt_current_time);
		txt_max_time = (TextView) findViewById(R.id.video_txt_max_time);
		img_white = (ImageView) findViewById(R.id.video_videoview_pres_front);
		img_bg = (ImageView) findViewById(R.id.video_videoview_pres_bg);
		img_center_speed = (ImageView) findViewById(R.id.video_img_center_speed);

		video_VideoView = (FullVideoView) findViewById(R.id.video_VideoView);

		view = findViewById(R.id.video_frame);
		// 获取屏幕宽度
		width = getWindowManager().getDefaultDisplay().getWidth();
		// 获取屏幕高度
		height = getWindowManager().getDefaultDisplay().getHeight();

		right_relative = (RelativeLayout) findViewById(R.id.video_relative_right);
		buttom_relative = (RelativeLayout) findViewById(R.id.video_relative_buttom);
		// 右边试图宽度为屏幕宽度的3分之1
		right_relative.getLayoutParams().width = width / 3;

		listview = (ListView) findViewById(R.id.video_listview);

		widgetListener();
	}

	@Override
	protected void init() {

		mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
		mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

		File file = new File(Path);
		if (!file.exists()) {
			file.mkdirs();
		}

		list = new ArrayList<VideoListBean>();

		mGestureDetector = new GestureDetector(this, new MyGestureListener());

		adapter = new VideoListAdapter(MainActivity.this, list);
		listview.setAdapter(adapter);

		new Thread(runnable2).start();
	}

	/** 点击事件 */
	private void widgetListener() {
		/** 列表点击事件 */
		listview.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				index_position = position;
				txt_max_time.setText(R.string.play_time);
				img_start.setImageResource(R.drawable.start_video_df);
				video_VideoView.stopPlayback();
				setVideo(position);
			}
		});

		/** 上一首 */
		img_last.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				index_position--;
				if (index_position>=0) {
					txt_max_time.setText(R.string.play_time);
					img_start.setImageResource(R.drawable.start_video_df);
					video_VideoView.stopPlayback();
					setVideo(index_position);
				}else{
					index_position=0;
				}
			}
		});
		/** 下一首 */
		img_next.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				index_position  ;
				img_start.setImageResource(R.drawable.start_video_df);
				txt_max_time.setText(R.string.play_time);
				video_VideoView.stopPlayback();
				setVideo(index_position);
			}
		});

		/** 播放 */
		img_start.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				video_img.setVisibility(View.GONE);
				if (video_VideoView.isPlaying()) {
					video_VideoView.pause();
					img_start.setImageResource(R.drawable.start_video_df);
				} else {
					mVideo_total_length = video_VideoView.getDuration();// 获取视频总长度
					// 设置总时长(总长度换算成时间)
					txt_max_time.setText(length2time(mVideo_total_length));
					isStart = true;
					video_VideoView.start();
					img_start.setImageResource(R.drawable.pause_video_df);
					handler.postAtTime(runnable, 0);
				}
			}
		});

		/** 全屏 */
		img_full.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (isVH) {
					WindowManager.LayoutParams params = getWindow().getAttributes();
					params.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
					getWindow().setAttributes(params);
					getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

					right_relative.setVisibility(View.GONE);
					buttom_relative.setVisibility(View.GONE);

					isVH = false;
				} else {
					WindowManager.LayoutParams params = getWindow().getAttributes();
					params.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
					getWindow().setAttributes(params);
					getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

					buttom_relative.setVisibility(View.VISIBLE);
					isVH = true;
				}
			}
		});
		/** 是否显示右边视图点击事件 */
		img_voice.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (right_relative.isShown()) {
					right_relative.setVisibility(View.GONE);
				} else {
					right_relative.setVisibility(View.VISIBLE);
				}
			}
		});
		/** 右边视图 */
		right_relative.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				right_relative.setVisibility(View.GONE);
			}
		});
	}

	private Runnable runnable2 = new Runnable() {

		@Override
		public void run() {
			doSearch(Path);
			Message message = handler.obtainMessage();
			message.what = handKey;
			handler.sendMessage(message);
		}
	};

	/**
	 * 搜索该路径下面的所有文件
	 *
	 * @version 1.0
	 * @createTime 2015年3月12日,下午2:11:47
	 * @updateTime 2015年3月12日,下午2:11:47
	 * @createAuthor WangYuWen
	 * @updateAuthor WangYuWen
	 * @updateInfo (此处输入修改内容,若无修改可不写.)
	 *
	 * @param path
	 */
	private void doSearch(String path) {
		File file = new File(path);

		if (file.exists()) {
			if (file.isDirectory()) {
				File[] fileArray = file.listFiles();
				for (File f : fileArray) {
					if (f.isDirectory()) {// 判断是否文件夹
								// 文件夹为true
						doSearch(f.getPath());
					} else {
						if (f.getName().endsWith("mp4") || f.getName().endsWith("3gp")) {
							VideoListBean bean = new VideoListBean();
							bean.setVideo_name(f.getName());
							bean.setVideo_path(f.getAbsolutePath());
							Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(f.getAbsolutePath(), Thumbnails.MINI_KIND);
							if (bitmap != null) {
								bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() * 300 / bitmap.getHeight(), 300, true);
								bean.setVideo_imgbg(bitmap);
							}
							list.add(bean);
						}
					}
				}
			}
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (mGestureDetector.onTouchEvent(event))
			return true;

		// 处理手势结束
		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_UP:
			endGesture();
			break;
		}
		return super.onTouchEvent(event);
	}

	/**
	 * 手势结束
	 *
	 * @version 1.0
	 * @createTime 2015年3月5日,上午11:36:43
	 * @updateTime 2015年3月5日,上午11:36:43
	 * @createAuthor WangYuWen
	 * @updateAuthor WangYuWen
	 * @updateInfo (此处输入修改内容,若无修改可不写.)
	 *
	 */
	private void endGesture() {
		if (!isVideo && !isVoice && !isBright) {
			if (right_relative.isShown()) {
				right_relative.setVisibility(View.GONE);
			}
			if (buttom_relative.isShown()) {
				buttom_relative.setVisibility(View.GONE);
			} else {
				buttom_relative.setVisibility(View.VISIBLE);
			}
		}

		isVideo = false;
		isVoice = false;
		isBright = false;

		OldMoveX = 0;
		OldMoveY = 0;

		// 隐藏
		img_center.setVisibility(View.GONE);
		img_center_speed.setVisibility(View.GONE);
		view.setVisibility(View.GONE);
	}

	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			if (msg.what == handKey) {
				setVideo(index_position);
				adapter.notifyDataSetChanged();
			}
		};
	};

	/**
	 * 设置Video该播放视频的准备和视频的背景图片
	 *
	 * @version 1.0
	 * @createTime 2015年3月12日,下午2:17:55
	 * @updateTime 2015年3月12日,下午2:17:55
	 * @createAuthor WangYuWen
	 * @updateAuthor WangYuWen
	 * @updateInfo (此处输入修改内容,若无修改可不写.)
	 *
	 * @param position
	 */
	@SuppressWarnings("deprecation")
	private void setVideo(int position) {
		if (list.size() > position && position>-1) {
			Drawable drawable = new BitmapDrawable(list.get(position).getVideo_imgbg());
			video_VideoView.setVideoPath(list.get(position).getVideo_path());
			video_VideoView.requestFocus();
			video_img.setVisibility(View.VISIBLE);
			video_img.setBackgroundDrawable(drawable);
		}
	}

	private Runnable runnable = new Runnable() {

		@Override
		public void run() {
			mVideo_current_length = video_VideoView.getCurrentPosition();

			if (mVideo_current_length >= mVideo_total_length) {
				mVideo_current_length = mVideo_total_length;
			}
			/** 设置当前时长 */
			txt_current_time.setText(length2time(mVideo_current_length));
			/** 设置视频进度 */
			LayoutParams layoutParams = (LayoutParams) img_white.getLayoutParams();
			layoutParams.width = (int) (((float) img_bg.getWidth()) / mVideo_total_length * mVideo_current_length);
			img_white.setLayoutParams(layoutParams);

			handler.postDelayed(runnable, 1000);

			if (mVideo_current_length >= mVideo_total_length) {
				handler.removeCallbacks(runnable);
			}

		}
	};

	/**
	 * 调节音量
	 *
	 * @version 1.0
	 * @createTime 2015年3月5日,上午11:16:35
	 * @updateTime 2015年3月5日,上午11:16:35
	 * @createAuthor WangYuWen
	 * @updateAuthor WangYuWen
	 * @updateInfo (此处输入修改内容,若无修改可不写.)
	 *
	 * @param num
	 */
	private void setVoiceNum(float num) {
		evens  ;//这里为什么要用个双数执行呢,因为手势滑动的太快音量只有15,控制了下音量增减速度,不然稍微滑动一下就到了最高或者最低这是我们用户不喜欢看到的。
		mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

		if (mVolume < 0) {
			mVolume = 0;
		}
		if (num < 0 && evens % 2 == 0) {
			mVolume -= 1;
		} else if (num > 0 && evens % 2 == 0) {
			mVolume  = 1;
		}

		if (mVolume > mMaxVolume) {
			mVolume = mMaxVolume;
		} else if (mVolume < 0) {
			mVolume = 0;
		}

		img_center.setImageResource(R.drawable.video_voice_bg);
		img_center.setVisibility(View.VISIBLE);
		view.setVisibility(View.VISIBLE);

		// 变更声音
		mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mVolume, 0);

		// 变更进度条
		ViewGroup.LayoutParams lp = img_pres_white.getLayoutParams();
		lp.width = DisplayUtils.dip2px(MainActivity.this, 100) * mVolume / mMaxVolume;
		img_pres_white.setLayoutParams(lp);
	}

	/**
	 * 调节视频进度
	 *
	 * @version 1.0
	 * @createTime 2015年3月5日,下午4:48:07
	 * @updateTime 2015年3月5日,下午4:48:07
	 * @createAuthor WangYuWen
	 * @updateAuthor WangYuWen
	 * @updateInfo (此处输入修改内容,若无修改可不写.)
	 *
	 * @param distanceX
	 */
	private void onVideoSpeed(float distanceX) {
		mVideo_current_length = video_VideoView.getCurrentPosition();// 当前播放长度

		if (distanceX > 0) {// 往左滑动 --
			img_center_speed.setVisibility(View.VISIBLE);
			img_center_speed.setImageResource(R.drawable.retreat_video);
			mVideo_current_length -= 1000;// 快进之后长度
		} else if (distanceX < 0) {// 往右滑动   
			img_center_speed.setVisibility(View.VISIBLE);
			img_center_speed.setImageResource(R.drawable.speed_video);
			mVideo_current_length  = 1000;// 快进之后长度
		}

		if (mVideo_current_length >= mVideo_total_length) {
			mVideo_current_length = mVideo_total_length;
		} else if (mVideo_current_length <= 0) {
			mVideo_current_length = 0;
		}
		video_VideoView.seekTo((int) mVideo_current_length);
		// //定位播放在哪个位置
		handler.postDelayed(runnable, 0);
	}

	/**
	 * 将进度长度转变为进度时间
	 *
	 * @version 1.0
	 * @createTime 2015年3月5日,下午4:25:05
	 * @updateTime 2015年3月5日,下午4:25:05
	 * @createAuthor WangYuWen
	 * @updateAuthor WangYuWen
	 * @updateInfo (此处输入修改内容,若无修改可不写.)
	 *
	 * @param length
	 * @return
	 */
	@SuppressLint("DefaultLocale")
	private String length2time(long length) {
		length /= 1000L;
		long minute = length / 60L;
		long hour = minute / 60L;
		long second = length % 60L;
		minute %= 60L;
		return String.format("%02d:%02d:%02d", hour, minute, second);
	}

	/**
	 * 调节亮度
	 *
	 * @version 1.0
	 * @createTime 2015年3月5日,上午11:16:44
	 * @updateTime 2015年3月5日,上午11:16:44
	 * @createAuthor WangYuWen
	 * @updateAuthor WangYuWen
	 * @updateInfo (此处输入修改内容,若无修改可不写.)
	 *
	 * @param percent
	 */
	private void onBrightnessSlide(float percent) {
		WindowManager.LayoutParams lpa = getWindow().getAttributes();
		mBrightness = lpa.screenBrightness;

		img_center.setImageResource(R.drawable.video_brightness_bg);
		img_center.setVisibility(View.VISIBLE);
		view.setVisibility(View.VISIBLE);

		lpa.screenBrightness = mBrightness   percent;
		if (lpa.screenBrightness > 1.0f) {
			lpa.screenBrightness = 1.0f;
		} else if (lpa.screenBrightness < 0.01f) {
			lpa.screenBrightness = 0.01f;
		}
		getWindow().setAttributes(lpa);
		// 变更亮度进度条
		ViewGroup.LayoutParams lp = img_pres_white.getLayoutParams();
		lp.width = (int) (DisplayUtils.dip2px(MainActivity.this, 100) * lpa.screenBrightness);
		img_pres_white.setLayoutParams(lp);
	}

	private class MyGestureListener extends SimpleOnGestureListener {
		/** 双击 */
		@Override
		public boolean onDoubleTap(MotionEvent e) {
			return true;
		}

		/** 滑动 */
		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
			// e1==按下的点 e2==移动的点
			downX = e1.getX();
			downY = e1.getY();
			moveX = e2.getX();
			moveY = e2.getY();
			if (OldMoveX == 0) {
				OldMoveX = downX;
				OldMoveY = downY;
			}
			if (Math.abs(moveY - downY) < Math.abs(moveX - downX) && !isVoice && !isBright && isStart) {
				handler.removeCallbacks(runnable);
				onVideoSpeed((OldMoveX - moveX) / width);
				OldMoveX = moveX;
				isVideo = true;
			} else {
				if (downX > width * 4 / 5 && !isVideo && !isBright) {// 右边滑动
					setVoiceNum((OldMoveY - moveY) / height);
					OldMoveY = moveY;
					isVoice = true;
				} else if (downX < width / 5 && !isVideo && !isVoice) {// 左边滑动
					onBrightnessSlide((OldMoveY - moveY) / height);
					OldMoveY = moveY;
					isBright = true;
				}
			}

			return super.onScroll(e1, e2, distanceX, distanceY);
		}
	}
}

标签: Android c d oa t

实例下载地址

android 视频播放器

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 chinse_lele 发表于: 2018-04-13 16:32 00
怎么播放?

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有3条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警