文章目录

  • 特点
  • 配置
    • 添加依赖
    • 添加布局
    • 添加逻辑
    • 修改AndroidManifest.xml
    • 小问题
    • 展示图
  • 自定义
    • 自定义UI
    • 编写自定义类
    • 重新应用控件
    • 应用
    • 总结
  • 参考链接

继续找播放器,找到了饺子播放器, JZVideo,据说它可以高度自定义,而且还可以结合ijkplayer的内核之类的。
这好像是之前的项目 点击这里,已经10.2k star了,现在的项目在 这里,最新版本应该是7.4.x了,但是新版本的源码不太好自定义,主要是我看的教程时6.4.2的,所以就换了。

特点

  1. 可以完全自定义UI和任何功能。
  2. 很容易切换播放引擎,支持的视频格式和协议取决于播放引擎,android.media.MediaPlayer或者ijkplayer等。
  3. 可以检测列表的滑动。
  4. 可以嵌入到多个控件中,比如ListView、Fragment,RecyclerView等等,多重嵌套也可以。
  5. 可以实现全屏播放和小窗播放。
  6. 可以在加载、暂停和播放等状态下切换全屏和退出全屏。
  7. 可以进行屏幕适配,铺满全屏或者全屏裁剪。
  8. 好像还支持重力感应自动横屏。
  9. 全屏后可以用手势修改进度和音量。
  10. Home键退出界面暂停播放,返回界面的时候继续播放。
  11. 等等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饺子播放器播放器配置使用以及其自定义相关推荐

  1. 超详细Redis入门教程——Redis 的安装与配置

    前言 本文小新为大家带来 超详细Redis入门教程--Redis 的安装与配置 相关知识,具体内容包括Redis 的安装,连接前的配置,Redis 客户端分类(包括:命令行客户端,图形界面客户端,Ja ...

  2. 超详细的Linux系统 -- CentOS7的下载安装配置教程

    一.安装下载 Vmware [点击这里查看安装详情] 二.下载 CentOS7 镜像 [点击这里查看下载详情] 三.使用VMware 安装 Centos7 超详细过程 1.我们首先打开自己下载的VMw ...

  3. 计算机组装实验diy装机清单,全侧透DIY装机实录:超详细i7-7700K配RX580组装电脑教程(附配置清单)...

    上周朋友找小编帮忙装一台玩游戏的主机,要求速度快,稳定,而且外观要炫酷还要散热好,琢磨了一下给列了个配置和价格,朋友觉得没问题就开始准备装机了. 全侧透DIY装机实录 i7-7700K配RX580组装 ...

  4. 超详细的Git下载安装、环境变量配置教程

    一.安装教程: 1.首先去官网下载git安装包,附网址:https://git-scm.com/ 官网下载会比较慢,附上csdn下载链接:https://download.csdn.net/downl ...

  5. VS+OpenCV+VC超详细的配置教程

    写在前面的话 版权声明:转载请注明出处! 博主是一个小菜鸟,并且非常玻璃心!如果文中有什么问题,请友好地指出来,博主查证后会进行更正. 每篇文章都是博主现阶段的理解,如果理解的更深入的话,博主会不定时 ...

  6. (超详细的新手教程)怎么下载JDK包?

    一.打开百度,搜索 " JDK " 选择 " java development kit (jdk) ",点击进去 二.找到 " JDK "包 ...

  7. 用Python实现问卷星自动填写(超详细!!!)

    用Python实现问卷星自动填写(超详细!!!) 前言 一.配置环境 1.1安装依赖 1.2安装驱动 二.实战处理 2.1.引入库函数 2.2.程序所需函数详解 (1)自定义单选函数 (2)自定义多选 ...

  8. Android开源音乐播放器之播放器基本功能

    系列文章 Android开源在线音乐播放器--波尼音乐 Android开源音乐播放器之播放器基本功能 Android开源音乐播放器之高仿云音乐黑胶唱片 Android开源音乐播放器之自动滚动歌词 An ...

  9. android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

最新文章

  1. C++ leetcode 7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
  2. STL中算法锦集(一)
  3. python 生成列向量_python_mmdt:一种基于敏感哈希生成特征向量的python库(一)
  4. AdaBoost算法详解与python实现
  5. Promise实战AJAX封装
  6. vbs当计算机重启,用vbs实现重新启动 Internet Explorer
  7. Java 进栈出栈的过程
  8. java url 传值乱码问题_java页面url传值中文乱码怎么办
  9. 福州街头大红灯笼高高挂
  10. c oracle 多条语句,Oracle 实践:如何编写一条 sql 语句获取数据表的全部索引信息(兼容 Oracle 19c、Oracle 11g)...
  11. hadoop无法停止
  12. 【神器】截图+贴图工具 Snipaste
  13. stm32 RTC闹钟唤醒低功耗模式
  14. selenium+java+TestNG 使用enabled 参数 —— 禁止执行一些case
  15. 【每日一短语】夜长梦多
  16. 微信小程序第三方登录
  17. 空间计量经济学(4)---空间滞后与空间杜宾误差模型
  18. web程序设计基础R实验报告 2021年 ---太原理工大学
  19. ThingsBoard 使用
  20. 什么是微型计算机的字长,计算机的字长是指什么

热门文章

  1. 苹果笔记本有uefi启动吗_联想和华硕笔记本重装系统时新BIOS无法设置u盘启动怎么办...
  2. 流水账之 QQ农场 (VS) 农民伯伯的农场
  3. JZOJ5996. 【WC2019模拟2019.1.12】回文后缀
  4. IPV4和IPV56的区别
  5. Windows PE开发环境
  6. 升级 phpStudy 中 MySQL 版本
  7. PP实施经验分享(21)——(ECC版本)生产版本\BOM\工艺路线选择(涉及批量大小应用)
  8. Juniper 命令集合,分好类了,网工收好了哦!
  9. CM-BERT: Cross-Modal BERT for Text-Audio Sentiment Analysis--文献笔记和翻译
  10. 【每日早报】2019/0604