前段时间由于项目需要用到类似于今日头条的视频播放器,实现在线播放,边缓存边播放,当然也可以播放本地文件,如下图:

这里我推荐大家使用的是jiecaovideoplayer开源库,这个库的播放引擎是ijkplayer,它调用ffmpeg, 原项目GitHub地址:https://github.com/lipangit/JieCaoVideoPlayer
一、项目引入:
1、添加类库

compile 'fm.jiecao:jiecaovideoplayer:4.8.3'
compile 'com.github.bumptech.glide:glide:3.7.0'

2、添加布局

 <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandardandroid:id="@+id/player_list_video"android:layout_width="match_parent"android:layout_height="220dp" />

3、下面就是我所说的通过设置视频地址、缩略图地址、标题等几行代码快速实现视频的播放啦

 JCVideoPlayerStandard player = (JCVideoPlayerStandard) findViewById(R.id.player_list_video);boolean setUp = player.setUp("http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, "");if (setUp) {Glide.with(MainActivity.this).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);}

4、在Activity中

@Overridepublic void onBackPressed() {if (JCVideoPlayer.backPress()) {return;}super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();JCVideoPlayer.releaseAllVideos();}

5、还有一点不要忘记哦,要添加权限滴:

<!--联网权限--><uses-permission android:name="android.permission.INTERNET" />

下面我们来看看我们运行效果:

二、如何使用jiecaovideoplayer播放本地视频
注意:jiecaovideoplayer支持file:///开头的文件播放,但是不支持assets或者raw目录下的视频,assets下的视频要先复制到本地路径才能播放,至于怎么监听播放完全呢,要继承JCvideoPlayerStandard 复写onAutoCOmplete函数

三、模拟用户点击开始按钮,直接进入全屏

 //直接进入全屏player.startFullscreen(this, JCVideoPlayerStandard.class, videoUrl, "");//模拟用户点击开始按钮,NORMAL状态下点击开始播放视频,播放中点击暂停视频player.startButton.performClick();

我把代码都贴出来吧:

package la.trytry.jiecaovideoplayer;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;import com.bumptech.glide.Glide;import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer;
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard;public class MainActivity extends AppCompatActivity {private String videoUrl = "http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4";private JCVideoPlayerStandard player;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);player = (JCVideoPlayerStandard) findViewById(R.id.player_list_video);boolean setUp = player.setUp(videoUrl, JCVideoPlayer.SCREEN_LAYOUT_LIST, "");if (setUp) {Glide.with(MainActivity.this).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);}//直接进入全屏player.startFullscreen(this, JCVideoPlayerStandard.class, videoUrl, "");//模拟用户点击开始按钮,NORMAL状态下点击开始播放视频,播放中点击暂停视频player.startButton.performClick();}@Overridepublic void onBackPressed() {if (JCVideoPlayer.backPress()) {return;}super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();JCVideoPlayer.releaseAllVideos();}}

四、下面回到我们的主题上,实现仿今日头条的视频播放
1、VideoActivity.java

package la.trytry.jiecaovideoplayer;import android.graphics.Rect;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.AbsListView;
import android.widget.ListView;import java.util.ArrayList;import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer;
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard;public class VideoActivity extends AppCompatActivity {private String videoUrl = "http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4";private ListView listView;private ArrayList<String> datas;private JCVideoPlayerStandard currPlayer;private VideoAdapter adapter;private AbsListView.OnScrollListener onScrollListener;private int firstVisible;//当前第一个可见的itemprivate int visibleCount;//当前可见的item个数@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video);listView = (ListView) findViewById(R.id.listview);initDatas();initListener();}private void initDatas() {datas = new ArrayList<String>();for (int i = 0; i < 20; i++) {datas.add(videoUrl);}adapter = new VideoAdapter(VideoActivity.this, datas, R.layout.item_video);listView.setAdapter(adapter);}/*** 滑动监听*/private void initListener() {onScrollListener = new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {switch (scrollState) {case AbsListView.OnScrollListener.SCROLL_STATE_FLING:break;case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://滑动停止自动播放视频autoPlayVideo(view);break;case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:break;}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (firstVisible == firstVisibleItem) {return;}firstVisible = firstVisibleItem;visibleCount = visibleItemCount;}};listView.setOnScrollListener(onScrollListener);}/*** 滑动停止自动播放视频*/private void autoPlayVideo(AbsListView view) {for (int i = 0; i < visibleCount; i++) {if (view != null && view.getChildAt(i) != null && view.getChildAt(i).findViewById(R.id.player_list_video) != null) {currPlayer = (JCVideoPlayerStandard) view.getChildAt(i).findViewById(R.id.player_list_video);Rect rect = new Rect();//获取当前view 的 位置currPlayer.getLocalVisibleRect(rect);int videoheight = currPlayer.getHeight();if (rect.top == 0 && rect.bottom == videoheight) {if (currPlayer.currentState == JCVideoPlayer.CURRENT_STATE_NORMAL|| currPlayer.currentState == JCVideoPlayer.CURRENT_STATE_ERROR) {currPlayer.startButton.performClick();}return;}}}//释放其他视频资源JCVideoPlayer.releaseAllVideos();}@Overridepublic void onBackPressed() {if (JCVideoPlayer.backPress()) {return;}super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();JCVideoPlayer.releaseAllVideos();}
}

在我们滑动的时候,jiecaovideoplayer会自动停止正在播放的视频,这里面我还添加了一个功能,就是监听当滑动停止的时候自动播放下一个视频
2、VideoAdapter.java

package la.trytry.jiecaovideoplayer;import android.content.Context;import com.bumptech.glide.Glide;
import com.zhy.adapter.abslistview.CommonAdapter;
import com.zhy.adapter.abslistview.ViewHolder;import java.util.List;import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer;
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard;/*** @author: lijuan* @description: 适配器* @date: 2016-12-04* @time: 17:04*/
public class VideoAdapter extends CommonAdapter<String> {private Context mContext;public VideoAdapter(Context context, List<String> datas, int layoutId) {super(context, layoutId, datas);this.mContext = context;}@Overrideprotected void convert(ViewHolder viewHolder, String url, int position) {JCVideoPlayerStandard player = viewHolder.getView(R.id.player_list_video);if (player != null) {player.release();}boolean setUp = player.setUp(url, JCVideoPlayer.SCREEN_LAYOUT_LIST, "");if (setUp) {Glide.with(mContext).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);}}
}

这里的适配器,我继承了鸿洋大神写的万能的Adapter,所以我们还需添加这个库的引用

compile 'com.zhy:base-adapter:3.0.3'

3、item_video.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
        android:id="@+id/player_list_video"android:layout_width="match_parent"android:layout_height="190dp" /><RelativeLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingBottom="8dp"android:paddingTop="8dp"><ImageView
            android:id="@+id/img_video_icon"android:layout_width="30dp"android:layout_height="30dp"android:layout_marginLeft="12dp"android:src="@mipmap/icon_default_head" /><TextView
            android:id="@+id/tv_video_userName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="12dp"android:layout_toRightOf="@id/img_video_icon"android:text="空城旧梦" /><TextView
            android:id="@+id/tv_video_comment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="12dp"android:drawablePadding="4dp"android:drawableLeft="@mipmap/icon_comment"android:text="21"android:textSize="12sp" /><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginRight="12dp"android:layout_toLeftOf="@id/tv_video_comment"android:text="3万次播放" /></RelativeLayout>
</LinearLayout>

4、activity_video.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" />

下面我们看看最终的效果

好了,本篇文章已经全部写完了,存在总结不到位的地方还望指导,感谢^_^

Android 仿今日头条的视频播放控件(几行代码快速实现)相关推荐

  1. Android 仿今日头条频道管理(下)(GridView之间Item的移动和拖拽)

    前言 上篇博客我们说到了今日头条频道管理的操作交互体验,我也介绍了2个GridView之间Item的相互移动.详情请參考:Android 仿今日头条频道管理(上)(GridView之间Item的移动和 ...

  2. 转载 Android仿今日头条详情页实现

    转载自@ice_Anson Android仿今日头条详情页实现 源码地址: Android仿今日头条详情页实现 github源码地址 动态图 最近项目有个需求,需要实现一个和今日头条新闻详情页一样的体 ...

  3. Android仿今日头条首页的顶部标签栏和底部导航栏

    Android仿今日头条首页的顶部标签栏和底部导航栏 先是底部导航栏TextView+ImageView+Fragment: 效果图: activity_main.xml布局: <?xml ve ...

  4. Android 仿微信语音录音小控件

    Android 仿微信语音录音小控件 前段时间一直在做IM聊天这方面的撸码工作,涉及到了很多小控件,有时间我会慢慢给大家分享一下我的小成果,希望大家一起学习,一起进步,今天来和大家来说一下Androi ...

  5. android仿今日头条个人中心页面

    android仿今日头条个人中心页面 效果图 实现步骤: 自定义ScrollView,添加一个反弹的动画 代码: package com.example.administrator.gerenzhon ...

  6. Android 仿今日头条首页标题栏效果

    今天带来的是仿今日头条首页的联动滑动效果,废话不多说,先上效果图: 思路: 做这个我们需要实现的效果有 1.滑动内容区域,标题栏会有变化来显示当前所处的位置. 2.点击标题栏,内容区域也会随着滑动并跳 ...

  7. android 今日头条加载动画,Android 仿今日头条简单的刷新效果实例代码

    点击按钮,先自动进行下拉刷新,也可以手动刷新,刷新完后,最后就多一行数据.有四个选项卡. 前两天导师要求做一个给本科学生预定机房座位的app,出发点来自这里.做着做着遇到很多问题,都解决了.这个效果感 ...

  8. Android 仿今日头条评论时键盘自动弹出的效果

    Android 仿今日头条评论时键盘自动弹出的效果:当点击评论时,弹出对话框,同时弹出软键盘,当点击返回键时,将对话框关闭,不只是关闭软键盘. 效果图: 对这个对话框设置一个style效果: < ...

  9. Android仿今日头条的开源项目

    起因 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的app就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到很多 ...

最新文章

  1. RedHat7.4最小化安装yum源不可用问题解决
  2. for语句的执行过程_带你深入了解Java流程控制语句
  3. 内存模型 C++ 和Java内存模型
  4. psychopy 与脑电打码 eeg
  5. tensorflow打印模型结构_五行代码用图提升模型表现,TensorFlow开源NSL神经结构学习框架...
  6. 从0到1打造一款react-native App(二)Navigation+Redux
  7. 计算机怎么登录用户名和密码忘了怎么办,如果我忘记了计算机的用户名和密码,该怎么办...
  8. 使用Python绘制词云图(自定义形状)
  9. MATLAB 插值与拟合
  10. Pearson 相关系数
  11. php screw 密钥,php-screw php代码加密工具用法(整理)
  12. doors需求管理导入HTML,Telelogic Doors 需求管理工具使用手记
  13. Lab3-实现计划项app辅助类实现
  14. Java实现 for循环输出空心的菱形 在main方法中调用printHollowRhombus()方法完成10行的空心菱形输出,其中 printHollo
  15. 初学Python案例之一(开平方代码)
  16. 中国网:防火墙之父发声
  17. ACL的rule中的deny/permit在各个业务模块里的场景是怎样的
  18. JAVA 时间和日期的API
  19. SpringBoot练手小案例-社区管理系统
  20. Oracle数据库审计功能的使用

热门文章

  1. 孙振耀退休感言(一)
  2. 男朋友创业项目不被看好,作为女朋友该不该支持?
  3. 插入u盘需重启计算机,电脑一插u盘就重启的原因及其解决方案
  4. 专利地图制作及解析研究
  5. 与蓝色巨人同行,葡萄城ComponentOne将全面服务于大连IBM工作室
  6. 听诊器的基本构造及其特征
  7. 美图2018Android岗面经
  8. 大话设计模式读书笔记之桥接模式
  9. 如何理解PPO算法的核心操作clip
  10. 有监督学习神经网络的回归拟合——基于红外光谱的汽油辛烷值预测(Matlab代码实现)