Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

超级播放器

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图

Screenshots

changechangechange

以下是我的配置,在app的build.gradle里面添加jitpack:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

##Gradle

dependencies {
compile 'com.github.xiaming5368.SuperPlayer:superplayerlibrary:v1.0.2'
}

#视频点播(直播)功能(播放网络视频,或者视频直播)# 设置视频源(视频地址)是否是直播还是点播

player.setLive(true);//true:表示直播地址;false表示点播地址

设置播放过程中是否监听网络的变化

player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化

设置播放过程中的视频开始播放

player.onPrepared(new SuperPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
/**
* 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏)
*/
}
})

设置视频是否已经播放完成

player.onComplete(new Runnable() {
@Override
public void run() {
/**
* 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作)
*/
}
})

设置视频播放失败的监听

player.onError(new SuperPlayer.OnErrorListener() {
@Override
public void onError(int what, int extra) {
/**
* 监听视频播放失败的回调
*/
}
})

设置视频播放的信息

player.onInfo(new SuperPlayer.OnInfoListener() {
@Override
public void onInfo(int what, int extra) {
/**
* 监听视频的相关信息。
*/
}
})

设置视频播放的标题

player.setTitle(url)//设置视频的titleName

设置视频播放大小

player.setScaleType(SuperPlayer.SCALETYPE_FITXY);
其中可以设置
/**
* fitParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **less** than the corresponding dimension of the view. like
* ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。
*/
public static final String SCALETYPE_FITPARENT = "fitParent";
/**
* fillParent:scale the video uniformly (maintain the video's aspect ratio)
* so that both dimensions (width and height) of the video will be equal to
* or **larger** than the corresponding dimension of the view .like
* ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。
*/
public static final String SCALETYPE_FILLPARENT = "fillParent";
/**
* wrapContent:center the video in the view,if the video is less than view
* perform no scaling,if video is larger than view then scale the video
* uniformly so that both dimensions (width and height) of the video will be
* equal to or **less** than the corresponding dimension of the view.
* 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。
*/
public static final String SCALETYPE_WRAPCONTENT = "wrapContent";
/**
* fitXY:scale in X and Y independently, so that video matches view
* exactly.不剪裁,非等比例拉伸画面填满整个View
*/
public static final String SCALETYPE_FITXY = "fitXY";
/**
* 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width
* and height) of the video will be equal to or **less** than the
* corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。
*/
public static final String SCALETYPE_16_9 = "16:9";
/**
* 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and
* height) of the video will be equal to or **less** than the corresponding
* dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。
*/
public static final String SCALETYPE_4_3 = "4:3";

设置视频播放的手势操作

/**
* 设置小屏幕是否支持手势操作(默认false)
* @param isSupportGesture
* true : 支持(小屏幕支持,大屏幕支持)
* false :不支持(小屏幕不支持,大屏幕支持)
* @return
*/
public SuperPlayer setSupportGesture(boolean isSupportGesture){
this.isSupportGesture = isSupportGesture;
return this;
}

还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class

#列表播放器# 很多的设置跟点播直播的一致。但是比较应该注意的地方

其一:初始化适配器

private void initAdapter() {
mAdapter = new SuperVideoAdapter(this,dataList);
superRecyclerView.setAdapter(mAdapter);
mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() {
@Override
public void onPlayclick(int position, RelativeLayout image) {
image.setVisibility(View.GONE);
if (player.isPlaying() && lastPostion == position){
return;
}
postion = position;
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
player.stopPlayVideo();
player.release();
}
}
if (lastPostion != -1) {
player.showView(R.id.adapter_player_control);
}
View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
player.showView(R.id.adapter_player_control);
frameLayout.addView(player);
player.play(dataList.get(position).getVideoUrl());
lastPostion = position;
}
});
/**
* 播放完设置还原播放界面
*/
player.onComplete(new Runnable() {
@Override
public void run() {
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null && last.getChildCount() > 0) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
}
}
}
});
/***
* 监听列表的下拉滑动
*/
superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
View controlview = view.findViewById(R.id.adapter_player_control);
if (controlview == null) {
return;
}
view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
if (player != null &&
((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE);
}
if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) {
if (player.getParent() != null)
((ViewGroup) player.getParent()).removeAllViews();
frameLayout.addView(player);
return;
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = superRecyclerView.getChildAdapterPosition(view);
if ((index) == postion) {
if (true) {
if (player != null) {
player.stop();
player.release();
player.showView(R.id.adapter_player_control);
}
}
}
}
});
}

其二:重写onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (player != null) {
player.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
fullScreen.removeAllViews();
superRecyclerView.setVisibility(View.VISIBLE);
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video);
frameLayout.removeAllViews();
ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
}
frameLayout.addView(player);
}
int mShowFlags =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
fullScreen.setSystemUiVisibility(mShowFlags);
} else {
ViewGroup viewGroup = (ViewGroup) player.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(player);
fullScreen.setVisibility(View.VISIBLE);
int mHideFlags =
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
;
fullScreen.setSystemUiVisibility(mHideFlags);
}
} else {
fullScreen.setVisibility(View.GONE);
}
}

#如果对该库有疑问或者有bug

欢迎大家提Issues,或者加QQ。楼主很乐意为你们解决问题。

#关于我

我是个流浪在广东珠海的小开发贼,喜欢玩暗影岛的虚拟世界中寻找自我(实则是个坑,如果有时间可以加个好友带带我)

联系方式:QQ 953267615 微信:super南仔

技术交流群:453177748

喜欢楼主的都可以加个朋友(ps:加的时候记得加上备注,为什么要加楼主,否则莫怪我残忍拒绝了)

#我的另外个开源库,喜欢的给个star

SuperRecycleView

#打赏支持 如果该库帮助到了你,为你减少了开发的时间,请随意打赏。您的支持将鼓励我继续创作!

change

#License

Copyright 2016 supercwn
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*

About

SuperPlayer 是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages