VideoView 官方
2016-04-13 21:35
393 查看
使用要点----
使用要点----
1.通过videoView.setVideoURI(Uri.parse(file.getAbsolutePath()));设置要播放的数据源
2.可以使用系统自带的控制栏,创建方式如下:
MediaController mediaController = new MediaController(this);
3.使用系统自带的控制栏时需要将VideoView和控制栏进行双向绑定。示例如下:
//将MediaController和VideoView绑定到一起
videoView.setMediaController(mediaController);
//双向绑定,将VideoView绑定到MediaController
mediaController.setMediaPlayer(videoView);
4.可以根据业务需求调整控制栏的位置:
//设置MediaController的左上右下的位置
mediaController.setPadding(0,0,0,200);
先上图
xml:
pro5:
示例代码:
<span style="font-size:18px;">package com.example.yaoan.videoviewtest; import android.graphics.Bitmap; import android.media.MediaMetadataRetriever; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import android.widget.VideoView; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity { private VideoView videoView; private ImageView imageView; private TextView tvCurrent; private TextView tvProgress; private SeekBar seekBar; //9.设置一个变量 判断当前是否在播放:防止退出应用后 handler还在发送消息 //需要在onDestory()方法中配置 private boolean isplay=false; //6.显示视频播放时间 显示方式 00:00 private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss"); //8.接受消息并处理 private Handler mhandler = new Handler(){ @Override public void handleMessage(Message msg) { if(!isplay) { //设置当前进度 tvCurrent.setText(simpleDateFormat.format(new Date(videoView.getCurrentPosition()))); //更新seekbar seekBar.setProgress(videoView.getCurrentPosition()); //每隔一秒再发送一条消息 这样seekbar就能实时更新 mhandler.sendEmptyMessageDelayed(0, 1000); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.查找布局控件 videoView = (VideoView) findViewById(R.id.videoview); imageView = (ImageView) findViewById(R.id.iv); tvCurrent = (TextView) findViewById(R.id.tv_currentpro); tvProgress = (TextView) findViewById(R.id.tv_nowprogress); seekBar = (SeekBar) findViewById(R.id.seekbar); //2.设置视频源(由于虚拟机罢工,就用小生的pro5来测测) File file = new File("/storage/sdcard1/音乐/", "曾经的你.mp4"); Uri videoFile = Uri.parse(file.getAbsolutePath()); videoView.setVideoURI(videoFile); /* *系统自带的控制面板 *MediaController mediaController = new MediaController(this); *需要双向绑定 *videoView.setMediaController(mediaController); *mediaController.setMediaPlayer(videoView); *如果 没啥事 就可以播放咯 *videoView.start(); * * 已经采用自定义控件,就不再采用上面这种方式 */ //3.获得视频的缩略图initImage(file)该方法返回一个bitmap Bitmap bitmap = initImage(file); //4.给ImageView设置bitmap imageView.setImageBitmap(bitmap); //5.设置ImageView的监听事件 当点击Imageview的时候把Imageview隐藏,然后播放视频 imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { imageView.setVisibility(View.GONE); videoView.start(); //接收到ImageView传递过来的消息后设置Textview的值 //设置视频总长 videoView.getDuration()为毫秒数需要转换 tvProgress.setText(simpleDateFormat.format(new Date(videoView.getDuration())) ); //设置seekbar 的最大值 seekBar.setMax(videoView.getDuration()); //7.创建Handler 发送一条 空消息 通知seekbar 和 2个TextView视频播放了 mhandler.sendEmptyMessage(0); } }); //10.拖动seekbar改变播放进度 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //fromUser代表是否用户在点击 true progress代表拖动的位置 进度 if (fromUser) { videoView.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private Bitmap initImage(File file) { //获得媒体文件信息的一个类 MediaMetadataRetriever mediaretriever = new MediaMetadataRetriever(); Bitmap bitmap =null; try { mediaretriever.setDataSource(this,Uri.parse(file.getAbsolutePath())); //任意时间 的一帧 bitmap = mediaretriever.getFrameAtTime(); return bitmap; } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); }finally { if (mediaretriever != null) { //销毁 mediaretriever.release(); } } return null; } @Override protected void onDestroy() { super.onDestroy(); isplay=true; } } /* 别忘了还得添加权限哦,不然去找google * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> * */ </span>
如需 播放网络视频点击查看:点击打开链接VideoView_- Vitamioplayer 包含显示缓冲百分比 网络速率
相关文章推荐
- Learning Scrapy笔记(零) - 前言
- 故事讲解:我是一个线程
- OneZero第四周第三次站立会议(2016.4.13)
- 倒计时三天——1813:熄灯问题
- img height test
- 截屏软件
- [BZOJ1883]Delicious Cake
- JAVA里的深克隆与浅克隆实现
- Android--view自定义--彩虹桥<跑马灯>
- 搭建storm集群(apache-storm-0.9.5.tar.gz) .
- 【c语言】将两个字符串s1和s2比较不要用strcmp
- 分数类
- DDNS更新 (3322和花生壳)
- [整理/转载]Github+HEXO (Mac)(二)
- bzoj4378 [POI2015]Logistyka
- HDU 1556 线段树/树状数组/区间更新姿势 三种方法处理
- 模版--大数加减乘除
- STL源码-内存的分配
- C/C++系列之系统启动流程
- 广域网模拟器—WANem安装使用教程