下面配置一下,引入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。
<LinearLayout
android:layout_width="400dp"
android:layout_height="200dp">
<cn.jzvd.JZVideoPlayerStandard
android: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();
}
@Override
public void onBackPressed() {
if (JZVideoPlayer.backPress()) {
return;
}
super.onBackPressed();
}
@Override
protected void onPause() {
super.onPause();
JZVideoPlayer.releaseAllVideos();
}
添加一下属性
<activity android:name=".VideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize">
这样子最基本的就搞定了,然后开始自定义。
因为我的软件是横屏的,在视频退出全屏后,会暂停,而且回到竖屏。
这里需要用到上面说的到的6.4.2版本源码,没有的话问题不大,我把代码放出来。
编写一个新的layout布局文件,作为我们自定义的控件,叫custon_videoview.xml,将JZVideo-6.4.2\jiaozivideoplayer\src\main\res\layout
中的jz_layout_std.xml
代码全部复制进来。
然后可以按照这个内容和布局,自己添加新的控件。
filename: custon_videoview.xml
<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">
<FrameLayout
android:id="@+id/surface_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
FrameLayout>
<ImageView
android: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" />
<LinearLayout
android: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">
<TextView
android:id="@+id/current"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:text="00:00"
android:textColor="#ffffff" />
<SeekBar
android: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" />
<TextView
android:id="@+id/total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:textColor="#ffffff" />
<TextView
android: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" />
<ImageView
android: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>
<ProgressBar
android: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" />
<ImageView
android: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" />
<RelativeLayout
android: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">
<ImageView
android: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" />
<TextView
android: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" />
<LinearLayout
android: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">
<ImageView
android:id="@+id/battery_level"
android:layout_width="23dp"
android:layout_height="10dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/jz_battery_level_10" />
<TextView
android: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>
<ProgressBar
android: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" />
<LinearLayout
android: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">
<ImageView
android: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>
<TextView
android: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" />
<LinearLayout
android: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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/video_loading_failed"
android:textColor="@android:color/white"
android:textSize="14sp" />
<TextView
android: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;
}
@Override
public int getLayoutId() {
return R.layout.custom_videoview;
}
@Override
public void init(Context context) {
super.init(context);
//获取自定义控件
}
@Override
public void onClick(View v) {
super.onClick(v);
//控件的单击事件
}
@Override
public 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;
}
@Override
public void onAutoCompletion() {
super.onAutoCompletion();
//并播放完后这里切换下一个视频的url
}
@Override
public void startWindowFullscreen() {
super.startWindowFullscreen();
//进入全屏时的状态
Toast.makeText(MyApplication.getContext(),"进入全屏",Toast.LENGTH_SHORT).show();
}
@Override
public 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