视频播放器(二)——播放列表
这一篇主要来讲视频的播放,上一篇说主页面是Indicator+ViewPager+Fragment的布局,所以,在线视频的数据是展示在OnlineFragment中,本地视频的数据是展示在LocalFragment中的。
一. 在线播放列表(OnlineFragment.java):
在OnlineFragment中,我们以GridView的形式展示网络视频数据,所以OnlineFragment中只包含一个GridView控件,看代码:
public class OnlineFragment extends Fragment {private GridView mGvOnline;private List<VideoInfo> mOnlineDatas;private OnlineGridAdapter mAdapter;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_online, null);mGvOnline = (GridView) view.findViewById(R.id.online_grid);mOnlineDatas = setData(3);mAdapter = new OnlineGridAdapter(getActivity(), mOnlineDatas);mGvOnline.setAdapter(mAdapter);return view;}/*** 以下为构造的虚假数据,如果真正项目,* 需要从服务去取视频相关数据* @param size*/private List<VideoInfo> setData(int size){List<VideoInfo> list = new ArrayList<VideoInfo>();for (int i=0; i<size; i++){String title = "新白娘子传奇(恶搞)";String url = "http://wsqncdn.miaopai.com/stream/jCbI0KliCs0jehZm4EwZ~g__.mp4";VideoInfo info = new VideoInfo();info.setTitle(title);info.setUrl(url);list.add(info);}return list;}
}
可以注意到,我们mOnlineDatas的数据是通过setData()方法造的一些假数据,正式项目需要从服务器拿视频的相关数据,我这里没有服务,所以就造了一些假的,但是我们的视频还是网络上的视频,这点不影响。mOnlineDatas需要设置给mAdapter,所以来看OnlineGridAdapter。
OnlineGridAdapter.java:
@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null){holder = new ViewHolder();convertView = mInflater.inflate(R.layout.item_online_grid, parent, false);holder.mIv = (ImageView) convertView.findViewById(R.id.item_online_image);holder.mTvTitle = (TextView) convertView.findViewById(R.id.item_online_title);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}holder.mTvTitle.setText(mDatas.get(position).getTitle());convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mContext, PlayActivity.class);intent.putExtra(Contants.VIDEO_POSITION, position);intent.putExtra(Contants.VIDEO_FILES, (Serializable) mDatas);intent.putExtra(Contants.VIDEO_FROM, Contants.ONLINE);mContext.startActivity(intent);}});return convertView;}
在线视频列表中,只展示了视频缩略图和标题,当然,这两个数据是在代码中写死的,正常应该是从服务器中拿。
最后,设置convertView的点击事件,当点击某一项时,跳转至PlayActivity页面播放视频,intent携带了三个参数,当前位置position,视频集合mDatas和视频来源(本地还是在线)。
效果图:
二. 本地播放列表(LocalFragment.java):
在LocalFragment中,我们是以List的形式展示本地视频数据的,所以,LocalFragment中包含一个ListView控件,代码如下:
public class LocalFragment extends Fragment {private ListView mLocalLv;private List<VideoInfo> mLocalDatas;private LocalListAdapter mAdapter;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_local, null);mLocalLv = (ListView) view.findViewById(R.id.local_list);mLocalDatas = Utils.getVideoFiles(getActivity());mAdapter = new LocalListAdapter(getActivity(), mLocalDatas);mLocalLv.setAdapter(mAdapter);return view;}
}
从上边可以看到,mLocalDatas的数据是调用Utils.getVideoFiles方法来获取SD上的视频文件的,而我们把每一个视频相关的信息封装为一个VideoInfo的实体类。然后把没LocalDatas设置给mAdapter,mAdapter负责展示在ListView中,下面来看LocalListAdapter。
LocalListAdapter.java:
只看最主要的getView方法:
@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null){holder = new ViewHolder();convertView = mInflater.inflate(R.layout.item_local_list, parent, false);holder.mIvThumb = (ImageView) convertView.findViewById(R.id.item_local_thumb);holder.mTvTitle = (TextView) convertView.findViewById(R.id.item_local_title);holder.mTvDuration = (TextView) convertView.findViewById(R.id.item_local_duration);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}Bitmap bitmap = Utils.getVideoThumbnail(mDatas.get(position).getUrl());if (bitmap != null){holder.mIvThumb.setImageBitmap(bitmap);}holder.mTvTitle.setText(mDatas.get(position).getDisplayName());holder.mTvDuration.setText(Utils.formatToString(mDatas.get(position).getDuration()));convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mContext, PlayActivity.class);intent.putExtra(Contants.VIDEO_POSITION, position);intent.putExtra(Contants.VIDEO_FILES, (Serializable) mDatas);intent.putExtra(Contants.VIDEO_FROM, Contants.LOCAL);mContext.startActivity(intent);}});return convertView;}
可以看到,我们展示在列表的视频信息有三个:缩略图,标题和时长。缩略图通过Utils.getVideoThumbnail()方法获取,标题和时长通过从LocalFragment传递过来的数据的集合获取。
最后,设置convertView的点击事件,当点击某一项时,跳转至PlayActivity页面播放视频,intent携带了三个参数,当前位置position,视频集合mDatas和视频来源(本地还是在线)。
效果图:
这一篇主要了解视频列表的布局和实现,下一篇最重要,开始讲如何播放视频
视频播放器(二)——播放列表相关推荐
- Android 视频播放器 (二):使用MediaPlayer播放视频
在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...
- 【Android视频 之 阿里云视频播放器 二】
说明一下:写文章时,我用的最新sdk版本是 4.7.0 哦,这里也只贴出关键代码,更多详细代码在文章末尾有地址链接的. [Android视频 之 阿里云视频播放器 一] 1 视频试看功能的实现 效果图 ...
- C++ Qt高仿QQ影音视频播放器 (二)
本篇介绍QQ影音标题栏的实现. 一般在Qt客户端开发时,都会采用无边框窗口,去掉窗口边框后就没有标题栏了,此时就得自定义标题栏,自己实现窗口的移动.拉伸.缩放等功能. 我是在VS2019里 ...
- Android课程设计之视频播放器
CSDN下载:https://download.csdn.net/download/eseszb/10463442 移动互联网开发 课程设计报告 学生姓名:学 号: 专业:计算机科学与技术 班级: ...
- Android FFmpeg视频播放器三 音频封装格式解码播放
Android FFmpeg视频播放器一解封装 Android Android FFmpeg视频播放器二 视频封装格式解码播放 视频解封装之后就会得到音频流和视频流,解封状得到的数据是AVPackag ...
- 【Android视频 之 阿里云视频播放器 一】
说到视频,现在短视频,小视频真是火的不行,抖音,快手,更是很多人手机上必会安装的一款app.那如何开发一款类似于抖音,集视频播放,直播,点播,拍摄,滤镜于一体的app呢,想想那都是相当的复杂.说到这里 ...
- 15个最佳HTML5视频播放器
随着YouTube最近的一项政策变化,即要求创作者在获得广告收入之前必须达到10,000次观看,因此我们看到了YouTube黄金时代的落日. 现在,比以往任何时候都更需要推动创意者开发自己的视频平台并 ...
- C语言基于GTK+Libvlc实现的简易视频播放器(二)
简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显示视频播放进度,但即使作为一个视频播放器,只有这些 ...
- android 音乐视频播放器(github上十二款最著名的Android播放器开源项目)
1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...
最新文章
- COS 访谈第 19 期:张志华教授
- 吴恩达机器学习笔记 —— 18 大规模机器学习
- Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式
- Codeforces 988F. Rain and Umbrellas
- 计算机专业研究生应该如何规划,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
- 个推开发者服务进阶之路
- 利用HttpWebRequest实现实体对象的上传
- Linux 命令(67)—— time 命令
- Vue-购物车简单案例
- 《大数据之路:阿里巴巴大数据实践》-第1章 总述
- laravel文件命名规范
- web接入 微信SDK
- smartbi 安装教程
- Jmeter与搜狗输入法、百度输入法不兼容问题解决方法
- Windows中如何修改Intel网卡的注册表使Wireshark可以抓取802.1q tag包
- 3.3 费马质数测试
- Android Manifest内容解析
- 在html中怎么加边框,HTML怎么加边框
- 计算机输入知识竞赛简讯,计算机学院积极参与“不忘初心之感知我矿大”知识竞赛...
- RK3229平台Android6.0系统的一些定制性需求开发
热门文章
- 追MM“23式”—— GOF 23种设计模式
- 01 电阻的简介及常见电路分析
- 面向对象开发期末复习概述(二)
- day9-字符串和集合作业
- babaliuliu游戏视频--选择1号角色初体验
- 三星临时取消Galaxy Fold中国发布会;视觉中国网站部分恢复上线?官方回应:并未恢复;特斯拉周一发布完全自动驾驶将网络直播 | 雷锋早报...
- Mardown、LaTex编辑器推荐
- 程序员常见10大口头禅
- 基于移动位置服务器,基于移动位置的服务系统及方法
- Swift SwiftUI 必备础库之 01 Introspect