【超详细】开源JZVideo饺子播放器播放器配置使用以及其自定义
文章目录
- 特点
- 配置
- 添加依赖
- 添加布局
- 添加逻辑
- 修改AndroidManifest.xml
- 小问题
- 展示图
- 自定义
- 自定义UI
- 编写自定义类
- 重新应用控件
- 应用
- 总结
- 参考链接
继续找播放器,找到了饺子播放器, JZVideo,据说它可以高度自定义,而且还可以结合ijkplayer的内核之类的。
这好像是之前的项目 点击这里,已经10.2k star了,现在的项目在 这里,最新版本应该是7.4.x了,但是新版本的源码不太好自定义,主要是我看的教程时6.4.2的,所以就换了。
特点
- 可以完全自定义UI和任何功能。
- 很容易切换播放引擎,支持的视频格式和协议取决于播放引擎,android.media.MediaPlayer或者ijkplayer等。
- 可以检测列表的滑动。
- 可以嵌入到多个控件中,比如ListView、Fragment,RecyclerView等等,多重嵌套也可以。
- 可以实现全屏播放和小窗播放。
- 可以在加载、暂停和播放等状态下切换全屏和退出全屏。
- 可以进行屏幕适配,铺满全屏或者全屏裁剪。
- 好像还支持重力感应自动横屏。
- 全屏后可以用手势修改进度和音量。
- Home键退出界面暂停播放,返回界面的时候继续播放。
- 等等etc,应该还可以有很多很多,等待开发。
配置
下面配置一下,引入JZVideo到项目里。
添加依赖
在build.gradle中添加
dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:26.1.0'implementation 'com.android.support.constraint:constraint-layout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'androidTestCompile('com.android.support:support-annotations:26.1.0') {force = true}......//饺子播放器compile 'cn.jzvd:jiaozivideoplayer:6.2.12'
}
好象这样也行implementation ‘cn.jzvd:jiaozivideoplayer:7.0.3’
添加布局
在layout文件中添加控件,外层最好添加一个Layout。
<LinearLayoutandroid:layout_width="400dp"android:layout_height="200dp"><cn.jzvd.JZVideoPlayerStandardandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent"></cn.jzvd.JZVideoPlayerStandard></LinearLayout>
添加逻辑
修改java代码,设置视频地址和缩略图等,缩略图可以用Glide
传入,还需要重写一下声明周期方法里的东西。
JZVideoPlayerStandard VideoPlayer=findViewById(R.id.video_view);VideoPlayer.setUp("http://jzvd.nathen.cn/c6e3dc12a1154626b3476d9bf3bd7266/6b56c5f0dc31428083757a45764763b0-5287d2089db37e62345123a1be272f8b.mp4",JZVideoPlayerStandard.SCREEN_WINDOW_NORMAL,"饺子闭眼睛");JZVideoPlayer.SAVE_PROGRESS = false;try {VideoPlayer.thumbImageView.setImageResource(R.drawable.diamond);}catch(Exception e){e.printStackTrace();}@Overridepublic void onBackPressed() {if (JZVideoPlayer.backPress()) {return;}super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();JZVideoPlayer.releaseAllVideos();}
修改AndroidManifest.xml
添加一下属性
<activity android:name=".VideoActivity"android:configChanges="orientation|keyboardHidden|screenSize">
这样子最基本的就搞定了,然后开始自定义。
小问题
因为我的软件是横屏的,在视频退出全屏后,会暂停,而且回到竖屏。
展示图
自定义
这里需要用到上面说的到的6.4.2版本源码,没有的话问题不大,我把代码放出来。
自定义UI
编写一个新的layout布局文件,作为我们自定义的控件,叫custon_videoview.xml,将JZVideo-6.4.2\jiaozivideoplayer\src\main\res\layout
中的jz_layout_std.xml
代码全部复制进来。
然后可以按照这个内容和布局,自己添加新的控件。
filename: custon_videoview.xml<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/black"android:descendantFocusability="afterDescendants"><FrameLayoutandroid:id="@+id/surface_container"android:layout_width="match_parent"android:layout_height="match_parent"></FrameLayout><ImageViewandroid:id="@+id/thumb"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"android:layout_alignParentBottom="true"android:background="#000000"android:scaleType="fitCenter" /><LinearLayoutandroid:id="@+id/layout_bottom"android:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentBottom="true"android:background="@drawable/jz_bottom_bg"android:gravity="center_vertical"android:orientation="horizontal"android:visibility="invisible"><TextViewandroid:id="@+id/current"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="14dp"android:text="00:00"android:textColor="#ffffff" /><SeekBarandroid:id="@+id/bottom_seek_progress"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1.0"android:background="@null"android:max="100"android:maxHeight="1dp"android:minHeight="1dp"android:paddingLeft="12dp"android:paddingTop="8dp"android:paddingRight="12dp"android:paddingBottom="8dp"android:progressDrawable="@drawable/jz_bottom_seek_progress"android:thumb="@drawable/jz_bottom_seek_thumb" /><TextViewandroid:id="@+id/total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="00:00"android:textColor="#ffffff" /><TextViewandroid:id="@+id/clarity"android:layout_width="wrap_content"android:layout_height="wrap_content"android:clickable="true"android:paddingLeft="20dp"android:text="clarity"android:textAlignment="center"android:textColor="#ffffff" /><ImageViewandroid:id="@+id/fullscreen"android:layout_width="52.5dp"android:layout_height="fill_parent"android:paddingLeft="14dp"android:paddingRight="14dp"android:scaleType="centerInside"android:src="@drawable/jz_enlarge" /></LinearLayout><ProgressBarandroid:id="@+id/bottom_progress"style="?android:attr/progressBarStyleHorizontal"android:layout_width="match_parent"android:layout_height="1.5dp"android:layout_alignParentBottom="true"android:max="100"android:progressDrawable="@drawable/jz_bottom_progress" /><ImageViewandroid:id="@+id/back_tiny"android:layout_width="24dp"android:layout_height="24dp"android:layout_marginLeft="6dp"android:layout_marginTop="6dp"android:background="@drawable/jz_click_back_tiny_selector"android:visibility="gone" /><RelativeLayoutandroid:id="@+id/layout_top"android:layout_width="match_parent"android:layout_height="48dp"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:background="@drawable/jz_title_bg"android:paddingStart="10dp"android:paddingLeft="10dp"android:visibility="gone"><ImageViewandroid:id="@+id/back"android:layout_width="26dp"android:layout_height="26dp"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginTop="12dp"android:padding="3dp"android:scaleType="centerInside"android:src="@drawable/jz_click_back_selector" /><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginEnd="12dp"android:layout_marginRight="12dp"android:layout_toLeftOf="@+id/battery_time_layout"android:layout_toEndOf="@+id/back"android:layout_toRightOf="@+id/back"android:ellipsize="end"android:maxLines="2"android:textColor="#ffffff"android:textSize="18sp" /><LinearLayoutandroid:id="@+id/battery_time_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginEnd="14dp"android:layout_marginRight="14dp"android:gravity="center_vertical"android:orientation="vertical"android:visibility="invisible"><ImageViewandroid:id="@+id/battery_level"android:layout_width="23dp"android:layout_height="10dp"android:layout_gravity="center_horizontal"android:background="@drawable/jz_battery_level_10" /><TextViewandroid:id="@+id/video_current_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:gravity="center_vertical"android:maxLines="1"android:textColor="#ffffffff"android:textSize="12.0sp" /></LinearLayout></RelativeLayout><ProgressBarandroid:id="@+id/loading"android:layout_width="@dimen/jz_start_button_w_h_normal"android:layout_height="@dimen/jz_start_button_w_h_normal"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:indeterminateDrawable="@drawable/jz_loading"android:visibility="invisible" /><LinearLayoutandroid:id="@+id/start_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:layout_gravity="center_vertical"><ImageViewandroid:id="@+id/start"android:layout_width="@dimen/jz_start_button_w_h_normal"android:layout_height="@dimen/jz_start_button_w_h_normal"android:src="@drawable/jz_click_play_selector" /></LinearLayout><TextViewandroid:id="@+id/replay_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/start_layout"android:layout_centerHorizontal="true"android:layout_marginTop="6dp"android:text="@string/replay"android:textColor="#ffffff"android:textSize="12sp"android:visibility="invisible" /><LinearLayoutandroid:id="@+id/retry_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:gravity="center_horizontal"android:orientation="vertical"android:visibility="invisible"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/video_loading_failed"android:textColor="@android:color/white"android:textSize="14sp" /><TextViewandroid:id="@+id/retry_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:background="@drawable/retry_bg"android:paddingLeft="9dp"android:paddingTop="4dp"android:paddingRight="9dp"android:paddingBottom="4dp"android:text="@string/click_to_restart"android:textColor="@android:color/white"android:textSize="14sp" /></LinearLayout>
</RelativeLayout>
然后把value/strings.xml
中的一些字符串内容复制到我们的项目里。
编写自定义类
需要重新写一个类,叫CustomJZVideo
,必须继承自JzvdStd
,但是在我的项目里他是JZVideoPlayerStandard
,问题不大。
在这个文件里,通过getLayoutId()
方法传入我们刚才写好的布局文件,获取控件,对控件的点击事件进行监听。
代码如下,里面用到的一些方法都有写注释他是干嘛的,这几个挺有用的感觉。
注意了,这里的构造方法一定要把两个多态都写上,我开始为了偷懒只写了一个,然后就报错了
package com.example.k.bilibiliapi.video;import android.content.Context;
import android.content.pm.ActivityInfo;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Toast;import com.example.k.bilibiliapi.MyApplication;
import com.example.k.bilibiliapi.R;import cn.jzvd.JZVideoPlayer;
import cn.jzvd.JZVideoPlayerStandard;/*** Created by kang on 2020/8/12.*/public class CustomJZVideo extends JZVideoPlayerStandard {Context context;public CustomJZVideo(Context context) {super(context);this.context=context;}public CustomJZVideo(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;}@Overridepublic int getLayoutId() {return R.layout.custom_videoview;}@Overridepublic void init(Context context) {super.init(context);//获取自定义控件}@Overridepublic void onClick(View v) {super.onClick(v);//控件的单击事件}@Overridepublic void setUp(Object[] dataSourceObjects, int defaultUrlMapIndex, int screen, Object... objects) {super.setUp(dataSourceObjects, defaultUrlMapIndex, screen, objects);//设置播放时屏幕状态JZVideoPlayer.FULLSCREEN_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;JZVideoPlayer.NORMAL_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;}@Overridepublic void onAutoCompletion() {super.onAutoCompletion();//并播放完后这里切换下一个视频的url}@Overridepublic void startWindowFullscreen() {super.startWindowFullscreen();//进入全屏时的状态Toast.makeText(MyApplication.getContext(),"进入全屏",Toast.LENGTH_SHORT).show();}@Overridepublic void playOnThisJzvd() {super.playOnThisJzvd();//退出全屏时的状态Toast.makeText(MyApplication.getContext(),"退出全屏",Toast.LENGTH_SHORT).show();}
}
重新应用控件
在布局文件中,将原有的cn.jzvd.JZVideoPlayerStandard
换成com.example.xxx.video.CustomJZVideo
,可以在类中也修改一下,将JZVideoPlayerStandard或者JZVideoPlayer
全部换成CustomJZVideo
,毕竟是继承嘛。
应用
然后应用一下,现在全屏和退出全屏的时候回有Toast提示消息,而且退出全屏后,仍然是横屏,因为我们重写的方法里设置了播放状态一直是横屏。
总结
至此自定义完成了。
在我找了好几个开源项目,n多博客以后,终于找到一个可以比较好比较完美的可以自定义的播放器控件了。
参考链接
Android 使用超简单的多媒体播放器JiaoZiVideoPlayer - 程思扬
Android饺子播放器自定义 - 孙先森i
【超详细】开源JZVideo饺子播放器播放器配置使用以及其自定义相关推荐
- 超详细Redis入门教程——Redis 的安装与配置
前言 本文小新为大家带来 超详细Redis入门教程--Redis 的安装与配置 相关知识,具体内容包括Redis 的安装,连接前的配置,Redis 客户端分类(包括:命令行客户端,图形界面客户端,Ja ...
- 超详细的Linux系统 -- CentOS7的下载安装配置教程
一.安装下载 Vmware [点击这里查看安装详情] 二.下载 CentOS7 镜像 [点击这里查看下载详情] 三.使用VMware 安装 Centos7 超详细过程 1.我们首先打开自己下载的VMw ...
- 计算机组装实验diy装机清单,全侧透DIY装机实录:超详细i7-7700K配RX580组装电脑教程(附配置清单)...
上周朋友找小编帮忙装一台玩游戏的主机,要求速度快,稳定,而且外观要炫酷还要散热好,琢磨了一下给列了个配置和价格,朋友觉得没问题就开始准备装机了. 全侧透DIY装机实录 i7-7700K配RX580组装 ...
- 超详细的Git下载安装、环境变量配置教程
一.安装教程: 1.首先去官网下载git安装包,附网址:https://git-scm.com/ 官网下载会比较慢,附上csdn下载链接:https://download.csdn.net/downl ...
- VS+OpenCV+VC超详细的配置教程
写在前面的话 版权声明:转载请注明出处! 博主是一个小菜鸟,并且非常玻璃心!如果文中有什么问题,请友好地指出来,博主查证后会进行更正. 每篇文章都是博主现阶段的理解,如果理解的更深入的话,博主会不定时 ...
- (超详细的新手教程)怎么下载JDK包?
一.打开百度,搜索 " JDK " 选择 " java development kit (jdk) ",点击进去 二.找到 " JDK "包 ...
- 用Python实现问卷星自动填写(超详细!!!)
用Python实现问卷星自动填写(超详细!!!) 前言 一.配置环境 1.1安装依赖 1.2安装驱动 二.实战处理 2.1.引入库函数 2.2.程序所需函数详解 (1)自定义单选函数 (2)自定义多选 ...
- Android开源音乐播放器之播放器基本功能
系列文章 Android开源在线音乐播放器--波尼音乐 Android开源音乐播放器之播放器基本功能 Android开源音乐播放器之高仿云音乐黑胶唱片 Android开源音乐播放器之自动滚动歌词 An ...
- android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...
Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...
最新文章
- C++ leetcode 7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
- STL中算法锦集(一)
- python 生成列向量_python_mmdt:一种基于敏感哈希生成特征向量的python库(一)
- AdaBoost算法详解与python实现
- Promise实战AJAX封装
- vbs当计算机重启,用vbs实现重新启动 Internet Explorer
- Java 进栈出栈的过程
- java url 传值乱码问题_java页面url传值中文乱码怎么办
- 福州街头大红灯笼高高挂
- c oracle 多条语句,Oracle 实践:如何编写一条 sql 语句获取数据表的全部索引信息(兼容 Oracle 19c、Oracle 11g)...
- hadoop无法停止
- 【神器】截图+贴图工具 Snipaste
- stm32 RTC闹钟唤醒低功耗模式
- selenium+java+TestNG 使用enabled 参数 —— 禁止执行一些case
- 【每日一短语】夜长梦多
- 微信小程序第三方登录
- 空间计量经济学(4)---空间滞后与空间杜宾误差模型
- web程序设计基础R实验报告 2021年 ---太原理工大学
- ThingsBoard 使用
- 什么是微型计算机的字长,计算机的字长是指什么
热门文章
- 苹果笔记本有uefi启动吗_联想和华硕笔记本重装系统时新BIOS无法设置u盘启动怎么办...
- 流水账之 QQ农场 (VS) 农民伯伯的农场
- JZOJ5996. 【WC2019模拟2019.1.12】回文后缀
- IPV4和IPV56的区别
- Windows PE开发环境
- 升级 phpStudy 中 MySQL 版本
- PP实施经验分享(21)——(ECC版本)生产版本\BOM\工艺路线选择(涉及批量大小应用)
- Juniper 命令集合,分好类了,网工收好了哦!
- CM-BERT: Cross-Modal BERT for Text-Audio Sentiment Analysis--文献笔记和翻译
- 【每日早报】2019/0604