Java代码部分:
package cn.com.iotek;
import java.io.IOException;
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.view.GestureDetector.OnGestureListener;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class PlayVideo extends Activity implements
OnGestureListener,
OnClickListener,// 监听
OnBufferingUpdateListener,// 当网络缓冲数据流变化的时候唤起的播放事件
OnCompletionListener,// 当媒体资源在播放的时候到达终点时唤起的播放事件
MediaPlayer.OnPreparedListener,
SurfaceHolder.Callback// 回调函数
{
// 视频高和宽
int videoWidth;
int videoHeight;
// 按钮
ImageButton play;
//定义快进按钮
ImageButton fastPlay;
//定义快退按钮
ImageButton fastBack;
// 控制栏
LinearLayout layout_control;
LinearLayout layout_prograss;
LinearLayout videoBack;
// 用来播放媒体
MediaPlayer mediaPlayer;
// 显示媒体
SurfaceView surView;
// 用来控制SurfaceView
SurfaceHolder surHolder;
// 路径
String path;
// 是否是播放状态
boolean boTing = true;
//获取播放的位置
int num;
//点击屏幕次数
int count;
//第一次点击
int firClick;
//第二次点击
int secClick;
//通过flag判断是否全屏
boolean flag;
//播放进度条
SeekBar seekbar;
//显示时间组建
TextView showTime;
//播放文件的时间
int minute;
int second;
//进度条进度
int progress;
//线程控制
MyThread mt;
//声音控制
SeekBar sound;
//声音进度
int soundId;
//显示音量
TextView showSound;
//接取拖动进度条
int videoLength;
boolean f = true;
//播放尺寸
//按钮隐藏时间
int hint = 5000;
//用于接取点击ListView位置
int position;
//声称随机数
Random random;
//通过buttonFlag判断按钮背景
boolean buttonFlag = true;
//显示视频总时间
TextView allTime;
TextView distant;
PopupWindow popuWindow;
View view;
boolean popFlag ;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.video);
// 产生对象
view = this.getLayoutInflater().inflate(R.layout.popuwindow, null);
//得到布局的ID
videoBack = (LinearLayout)view.findViewById(R.id.videoback);
// 产生对象
play = (ImageButton) view.findViewById(R.id.video_bu_bofang);
layout_control = (LinearLayout)findViewById(R.id.layout_control);
layout_prograss= (LinearLayout)findViewById(R.id.layout_prograss);
seekbar = (SeekBar)view.findViewById(R.id.seekbar);
showTime = (TextView)view.findViewById(R.id.showtime);
fastPlay = (ImageButton)view.findViewById(R.id.fastplay);
fastBack = (ImageButton)view.findViewById(R.id.fastback);
sound = (SeekBar)view.findViewById(R.id.sound);
showSound = (TextView)view.findViewById(R.id.showsound);
surView = (SurfaceView) findViewById(R.id.surfaceview_1);
allTime = (TextView)view.findViewById(R.id.alltime);
distant = (TextView)findViewById(R.id.distant);
surHolder = surView.getHolder();
popuWindow = new PopupWindow(view, LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
// 设置回调函数
surHolder.addCallback(this);
// 设置风格
surHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//bu_boFang.setVisibility(View.INVISIBLE);
// 设置按键监听
play.setOnClickListener(this);
//快进监听
fastPlay.setOnClickListener(this);
//快退按钮监听
fastBack.setOnClickListener(this);
//new随机数对象
random = new Random();
//接取到播放列表中点击的位置
position = VideoList.position;
try {
//获取ShareActivity上下文
VideoList.context = createPackageContext("cn.com.iotek", Context.CONTEXT_IGNORE_SECURITY);
VideoList.share = VideoList.context.getSharedPreferences("setupadapter", VideoList.context.MODE_WORLD_READABLE);
VideoList.editor = VideoList.share.edit();
} catch (NameNotFoundException e) {
e.printStackTrace();
}
//对读取的信息进行判断
if (VideoList.share.getString("hinttime", "5秒").equals("5秒")) {
hint = 5000;
}
if (VideoList.share.getString("hinttime", "5秒").equals("10秒")) {
hint = 10000;
}
if (VideoList.share.getString("hinttime", "5秒").equals("15秒")) {
hint = 15000;
}
//设置全屏播放
surView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
// handler.sendEmptyMessageAtTime(0x11, 3000);
if(MotionEvent.ACTION_DOWN == event.getAction()){
count++;
if(count == 1){
new countClear().start();
firClick = (int) System.currentTimeMillis();
if (!popFlag) {
// // // popuWindow = new PopupWindow(view, LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
popuWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
popFlag = true;
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
//设置layout显示
// if (!flag) {
/* layout_control.setVisibility(View.VISIBLE);
layout_prograss.setVisibility(View.VISIBLE);*/
//点击surfaceView延时3S发送信息
/* handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);*/
// }
} else if (count == 2){
secClick = (int) System.currentTimeMillis();
if(secClick - firClick < 1000){
flag = !flag;
count = 0;
}
if(flag){
distant.setHeight(0);
surView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
surHolder.setFixedSize(480, 760);
if (!popFlag) {
// popuWindow = new PopupWindow(view, LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
popuWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
popFlag = true;
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
// 开始播放
// mePlayer.start();
}else{
if (VideoList.share.getString("size", "4:3").equals("4:3")) {
surView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 360));
surHolder.setFixedSize(480, 360);
distant.setHeight(250);
if (!popFlag) {
// popuWindow = new PopupWindow(view, LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
popuWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
popFlag = true;
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
}
if (VideoList.share.getString("size", "4:3").equals("16:9")) {
surView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 270));
surHolder.setFixedSize(480, 270);
distant.setHeight(250);
if (!popFlag) {
// popuWindow = new PopupWindow(view, LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
popuWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
popFlag = true;
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
}
}
count = 0;
firClick = 0;
secClick = 0;
}
}
return true;
}
});
//监听进度条进度
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
videoLength = seekBar.getProgress();
// int q = mediaPlayer.getCurrentPosition();
mediaPlayer.seekTo(videoLength);
//获取进度条当前的位置
// int dest = seekBar.getProgress();
//设置播放器当期的播放位置
// mediaPlayer.seekTo(num);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
//得到seekbar的进度
/* seekbar.setProgress(progress);
videoLength = seekBar.getProgress();*/
}
});
sound.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
int i= seekBar.getProgress();
mediaPlayer.setVolume(i/100f,i/100f);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
int i= sound.getProgress();
showSound.setText("音量:"+i);
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
});
}
private void playVideo(){
// 构建MediaPlayer对象
mediaPlayer = new MediaPlayer();
try {
// 设置媒体文件路径
mediaPlayer.setDataSource(VideoList.path);
// 设置通过SurfaceView来显示画面
mediaPlayer.setDisplay(surHolder);
// 准备
mediaPlayer.prepare();
distant.setHeight(200);
// 设置事件监听
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
seekbar.setMax(mediaPlayer.getDuration());
//设置当前播放音量最大
soundId = sound.getProgress();
mediaPlayer.setVolume(soundId, soundId);
showSound.setText("音量:"+soundId);
mt = new MyThread();
mt.start();
handler.sendEmptyMessage(0x13);
int n = mediaPlayer.getDuration();//获得持续时间
seekbar.setMax(n);
n = n/1000;
int m = n/60;
int h = m/60;
int s = n%60;
m = m%60;
allTime.setText(String.format("影片长度:"+"%02d:%02d:%02d", h,m,s));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// MediaPlayer.OnPreparedListener
public void onCompletion(MediaPlayer mp) {
handler.sendEmptyMessage(0x14);
}
// MediaPlayer.OnPreparedListener
// 这时能确保player处于Prepared状态,触发start是最合适的
public void onPrepared(MediaPlayer mp) {
if (VideoList.share.getString("size", "4:3").equals("4:3")) {
surView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 360));
// 设置播放视频的宽度和高度
surHolder.setFixedSize(480, 360);
// 开始播放
mediaPlayer.start();
}
if (VideoList.share.getString("size", "4:3").equals("16:9")) {
// 设置播放视频的宽度和高度
surView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 270));
surHolder.setFixedSize(480, 270);
// 开始播放
mediaPlayer.start();
}
}
public void surfaceCreated(SurfaceHolder holder) {
playVideo();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
protected void onDestroy()
{
super.onDestroy();
if (mediaPlayer != null)
{
mediaPlayer.release();
mediaPlayer = null;
//关闭cursor
// VideoList.cursor.close();
//关闭数据库
// VideoList.db.close();
//改变线程循环条件
f = false;
handler.removeMessages(0x11);
popuWindow.dismiss();
}
}
public void onClick(View v) {
if(v==play){
//如果正在播放
if (buttonFlag) {
play.setImageResource(R.drawable.pause_1);
mediaPlayer.pause();
buttonFlag = false;
}else{
play.setImageResource(R.drawable.play_1);
mediaPlayer.start();
buttonFlag = true;
}
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
if (v == fastPlay) {
int i = mediaPlayer.getCurrentPosition()+5000;
mediaPlayer.seekTo(i);
seekbar.setProgress(i);
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
if (v == fastBack) {
int i = mediaPlayer.getCurrentPosition()-5000;
mediaPlayer.seekTo(i);
seekbar.setProgress(i);
handler.removeMessages(0x11);
handler.sendEmptyMessageDelayed(0x11, hint);
}
}
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what == 0x11) {
if(popuWindow.isShowing()&&f){
popuWindow.dismiss();
popFlag = false;
}
////启动后设置layout隐藏
/* layout_control.setVisibility(View.INVISIBLE);
layout_prograss.setVisibility(View.INVISIBLE);*/
}
if (msg.what == 0x12) {
if(mediaPlayer!=null){
num = mediaPlayer.getCurrentPosition();
}
seekbar.setProgress(num);
// 为时 分 秒赋值
num = num/1000;
int minute = num/60;
int hour = minute/60;
int second = num%60;
minute = minute%60;
/* if (mediaPlayer!=null) {
seekbar.setProgress(mediaPlayer.getCurrentPosition());
}*/
showTime.setText(String.format("播放进度:"+"%02d:%02d:%02d", hour,minute,second));
// handler.sendEmptyMessage(0x12);
}
if (msg.what == 0x14) {
if (VideoList.share.getString("playstyle","顺序播放").equals("单曲循环")) {
//释放播放的视频
mediaPlayer.release();
//游标移动到点击ListView位置
// VideoList.cursor.moveToPosition(VideoList.position);
//在数据库中取出ListView点击的路径
VideoList.path = VideoList.cursor.getString(1);
//播放视频
playVideo();
}
if (VideoList.share.getString("playstyle", "顺序播放").equals("顺序播放")) {
//释放当前的MediaPlayer
mediaPlayer.release();
//自加
position ++;
if (position==VideoList.videoList.getCount()) {
position = 0;
}
//游标向下移动
VideoList.cursor.moveToPosition(position);
//取出移动后的视频路径
VideoList.path = VideoList.cursor.getString(1);
//播放视频
playVideo();
}
if (VideoList.share.getString("playstyle", "顺序播放").equals("随机播放")) {
//释放播放的视频
mediaPlayer.release();
int r = random.nextInt(VideoList.videoList.getCount()-1);
VideoList.cursor.moveToPosition(r);
//在数据库中取出ListView点击的路径
VideoList.path = VideoList.cursor.getString(1);
//播放视频
playVideo();
}
}
};
};
class MyThread extends Thread{
@Override
public void run() {
handler.sendEmptyMessageDelayed(0x11, hint);
// if (mePlayer.getDuration()+"".equals("0") ) {
while (f) {
try {
sleep(1000);
handler.sendEmptyMessage(0x12);
}catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// }
}
}
class countClear extends Thread{
@Override
public void run() {
try {
sleep(1000);
//睡一秒后count清0
count = 0;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// TODO Auto-generated method stub
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
}
配置文件:
Video.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/videoback"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:id="@+id/distant"/>
<SurfaceView
android:id="@+id/surfaceview_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="300px"
android:layout_gravity="center_horizontal" />
</LinearLayout>
Popuwindow.xml配置文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/videoback"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/layout_prograss"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="vertical" >
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="8px"
android:progressDrawable="@drawable/seekbar"
android:thumb="@drawable/seekbutton"
android:progress="0" />
<TextView
android:id="@+id/showtime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/alltime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<SeekBar
android:id="@+id/sound"
android:layout_width="match_parent"
android:layout_height="8px"
android:progressDrawable="@drawable/seekbar"
android:thumb="@drawable/seekbutton"
android:progress="50" />
<TextView
android:id="@+id/showsound"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/layout_control"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/fastback"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#00000000"
android:scaleType="fitCenter"
android:src="@drawable/stepback" />
<ImageButton
android:id="@+id/video_bu_bofang"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#00000000"
android:scaleType="fitCenter"
android:src="@drawable/play_1" />
<ImageButton
android:id="@+id/fastplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#00000000"
android:scaleType="fitCenter"
android:src="@drawable/stepfor" />
</LinearLayout>
</LinearLayout>