Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_26386469
GSYVideoPlayer
提交
f7910cf3
G
GSYVideoPlayer
项目概览
qq_26386469
/
GSYVideoPlayer
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
GSYVideoPlayer
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f7910cf3
编写于
2月 19, 2017
作者:
S
shuyu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
* 优化了弹幕的显示逻辑
上级
1becbed5
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
482 addition
and
96 deletion
+482
-96
app/src/main/AndroidManifest.xml
app/src/main/AndroidManifest.xml
+4
-0
app/src/main/java/com/example/gsyvideoplayer/DanmkuVideoActivity.java
.../java/com/example/gsyvideoplayer/DanmkuVideoActivity.java
+190
-0
app/src/main/java/com/example/gsyvideoplayer/DetailPlayer.java
...rc/main/java/com/example/gsyvideoplayer/DetailPlayer.java
+2
-3
app/src/main/java/com/example/gsyvideoplayer/MainActivity.java
...rc/main/java/com/example/gsyvideoplayer/MainActivity.java
+4
-1
app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java
...main/java/com/example/gsyvideoplayer/utils/JumpUtils.java
+11
-0
app/src/main/java/com/example/gsyvideoplayer/video/DanmakuVideoPlayer.java
.../com/example/gsyvideoplayer/video/DanmakuVideoPlayer.java
+147
-48
app/src/main/res/layout/activity_danmaku_layout.xml
app/src/main/res/layout/activity_danmaku_layout.xml
+37
-0
app/src/main/res/layout/activity_detail_player.xml
app/src/main/res/layout/activity_detail_player.xml
+1
-1
app/src/main/res/layout/activity_main.xml
app/src/main/res/layout/activity_main.xml
+9
-1
app/src/main/res/layout/danmaku_layout.xml
app/src/main/res/layout/danmaku_layout.xml
+77
-42
未找到文件。
app/src/main/AndroidManifest.xml
浏览文件 @
f7910cf3
...
...
@@ -63,6 +63,10 @@
android:name=
".RecyclerViewActivity"
android:configChanges=
"orientation|keyboardHidden|screenSize"
android:screenOrientation=
"portrait"
/>
<activity
android:name=
".DanmkuVideoActivity"
android:configChanges=
"orientation|keyboardHidden|screenSize"
android:screenOrientation=
"portrait"
/>
</application>
</manifest>
\ No newline at end of file
app/src/main/java/com/example/gsyvideoplayer/DanmkuVideoActivity.java
0 → 100644
浏览文件 @
f7910cf3
package
com.example.gsyvideoplayer
;
import
android.content.pm.ActivityInfo
;
import
android.content.res.Configuration
;
import
android.os.Bundle
;
import
android.support.v4.widget.NestedScrollView
;
import
android.support.v7.app.AppCompatActivity
;
import
android.view.View
;
import
android.widget.ImageView
;
import
android.widget.RelativeLayout
;
import
com.example.gsyvideoplayer.listener.SampleListener
;
import
com.example.gsyvideoplayer.video.DanmakuVideoPlayer
;
import
com.shuyu.gsyvideoplayer.GSYPreViewManager
;
import
com.shuyu.gsyvideoplayer.GSYVideoPlayer
;
import
com.shuyu.gsyvideoplayer.listener.LockClickListener
;
import
com.shuyu.gsyvideoplayer.utils.OrientationUtils
;
import
com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
;
import
butterknife.BindView
;
import
butterknife.ButterKnife
;
/**
* Created by guoshuyu on 2017/2/19.
* 弹幕
*/
public
class
DanmkuVideoActivity
extends
AppCompatActivity
{
@BindView
(
R
.
id
.
post_detail_nested_scroll
)
NestedScrollView
postDetailNestedScroll
;
@BindView
(
R
.
id
.
danmaku_player
)
DanmakuVideoPlayer
danmakuVideoPlayer
;
@BindView
(
R
.
id
.
activity_detail_player
)
RelativeLayout
activityDetailPlayer
;
private
boolean
isPlay
;
private
boolean
isPause
;
private
OrientationUtils
orientationUtils
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_danmaku_layout
);
ButterKnife
.
bind
(
this
);
String
url
=
"http://baobab.wdjcdn.com/14564977406580.mp4"
;
//String url = "https://res.exexm.com/cw_145225549855002";
danmakuVideoPlayer
.
setUp
(
url
,
true
,
null
,
"测试视频"
);
//增加封面
ImageView
imageView
=
new
ImageView
(
this
);
imageView
.
setScaleType
(
ImageView
.
ScaleType
.
CENTER_CROP
);
imageView
.
setImageResource
(
R
.
mipmap
.
xxx1
);
danmakuVideoPlayer
.
setThumbImageView
(
imageView
);
resolveNormalVideoUI
();
//外部辅助的旋转,帮助全屏
orientationUtils
=
new
OrientationUtils
(
this
,
danmakuVideoPlayer
);
//初始化不打开外部的旋转
orientationUtils
.
setEnable
(
false
);
danmakuVideoPlayer
.
setIsTouchWiget
(
true
);
//关闭自动旋转
danmakuVideoPlayer
.
setRotateViewAuto
(
false
);
danmakuVideoPlayer
.
setLockLand
(
false
);
danmakuVideoPlayer
.
setShowFullAnimation
(
false
);
danmakuVideoPlayer
.
setNeedLockFull
(
true
);
//detailPlayer.setOpenPreView(true);
danmakuVideoPlayer
.
getFullscreenButton
().
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
//直接横屏
orientationUtils
.
resolveByClick
();
//第一个true是否需要隐藏actionbar,第二个true是否需要隐藏statusbar
danmakuVideoPlayer
.
startWindowFullscreen
(
DanmkuVideoActivity
.
this
,
true
,
true
);
}
});
danmakuVideoPlayer
.
setStandardVideoAllCallBack
(
new
SampleListener
()
{
@Override
public
void
onPrepared
(
String
url
,
Object
...
objects
)
{
super
.
onPrepared
(
url
,
objects
);
//开始播放了才能旋转和全屏
orientationUtils
.
setEnable
(
true
);
isPlay
=
true
;
}
@Override
public
void
onAutoComplete
(
String
url
,
Object
...
objects
)
{
super
.
onAutoComplete
(
url
,
objects
);
}
@Override
public
void
onClickStartError
(
String
url
,
Object
...
objects
)
{
super
.
onClickStartError
(
url
,
objects
);
}
@Override
public
void
onQuitFullscreen
(
String
url
,
Object
...
objects
)
{
super
.
onQuitFullscreen
(
url
,
objects
);
if
(
orientationUtils
!=
null
)
{
orientationUtils
.
backToProtVideo
();
}
}
});
danmakuVideoPlayer
.
setLockClickListener
(
new
LockClickListener
()
{
@Override
public
void
onClick
(
View
view
,
boolean
lock
)
{
if
(
orientationUtils
!=
null
)
{
//配合下方的onConfigurationChanged
orientationUtils
.
setEnable
(!
lock
);
}
}
});
}
@Override
public
void
onBackPressed
()
{
if
(
orientationUtils
!=
null
)
{
orientationUtils
.
backToProtVideo
();
}
if
(
StandardGSYVideoPlayer
.
backFromWindowFull
(
this
))
{
return
;
}
super
.
onBackPressed
();
}
@Override
protected
void
onPause
()
{
super
.
onPause
();
isPause
=
true
;
}
@Override
protected
void
onResume
()
{
super
.
onResume
();
isPause
=
false
;
}
@Override
protected
void
onDestroy
()
{
super
.
onDestroy
();
GSYVideoPlayer
.
releaseAllVideos
();
GSYPreViewManager
.
instance
().
releaseMediaPlayer
();
if
(
orientationUtils
!=
null
)
orientationUtils
.
releaseListener
();
}
@Override
public
void
onConfigurationChanged
(
Configuration
newConfig
)
{
super
.
onConfigurationChanged
(
newConfig
);
//如果旋转了就全屏
if
(
isPlay
&&
!
isPause
)
{
if
(
newConfig
.
orientation
==
ActivityInfo
.
SCREEN_ORIENTATION_USER
)
{
if
(!
danmakuVideoPlayer
.
isIfCurrentIsFullscreen
())
{
danmakuVideoPlayer
.
startWindowFullscreen
(
DanmkuVideoActivity
.
this
,
true
,
true
);
}
}
else
{
//新版本isIfCurrentIsFullscreen的标志位内部提前设置了,所以不会和手动点击冲突
if
(
danmakuVideoPlayer
.
isIfCurrentIsFullscreen
())
{
StandardGSYVideoPlayer
.
backFromWindowFull
(
this
);
}
if
(
orientationUtils
!=
null
)
{
orientationUtils
.
setEnable
(
true
);
}
}
}
}
private
void
resolveNormalVideoUI
()
{
//增加title
danmakuVideoPlayer
.
getTitleTextView
().
setVisibility
(
View
.
GONE
);
danmakuVideoPlayer
.
getTitleTextView
().
setText
(
"测试视频"
);
danmakuVideoPlayer
.
getBackButton
().
setVisibility
(
View
.
GONE
);
}
}
\ No newline at end of file
app/src/main/java/com/example/gsyvideoplayer/DetailPlayer.java
浏览文件 @
f7910cf3
...
...
@@ -10,7 +10,6 @@ import android.widget.ImageView;
import
android.widget.RelativeLayout
;
import
com.example.gsyvideoplayer.listener.SampleListener
;
import
com.example.gsyvideoplayer.video.DanmakuVideoPlayer
;
import
com.example.gsyvideoplayer.video.LandLayoutVideo
;
import
com.shuyu.gsyvideoplayer.GSYPreViewManager
;
import
com.shuyu.gsyvideoplayer.GSYVideoPlayer
;
...
...
@@ -33,7 +32,7 @@ public class DetailPlayer extends AppCompatActivity {
//推荐使用StandardGSYVideoPlayer,功能一致
//CustomGSYVideoPlayer部分功能处于试验阶段
@BindView
(
R
.
id
.
detail_player
)
DanmakuVideoPlayer
detailPlayer
;
LandLayoutVideo
detailPlayer
;
@BindView
(
R
.
id
.
activity_detail_player
)
RelativeLayout
activityDetailPlayer
;
...
...
@@ -72,7 +71,7 @@ public class DetailPlayer extends AppCompatActivity {
detailPlayer
.
setLockLand
(
false
);
detailPlayer
.
setShowFullAnimation
(
false
);
detailPlayer
.
setNeedLockFull
(
true
);
//
detailPlayer.setOpenPreView(true);
detailPlayer
.
setOpenPreView
(
true
);
detailPlayer
.
getFullscreenButton
().
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
...
...
app/src/main/java/com/example/gsyvideoplayer/MainActivity.java
浏览文件 @
f7910cf3
...
...
@@ -27,7 +27,7 @@ public class MainActivity extends AppCompatActivity {
ButterKnife
.
bind
(
this
);
}
@OnClick
({
R
.
id
.
open_btn
,
R
.
id
.
list_btn
,
R
.
id
.
list_btn_2
,
R
.
id
.
list_detail
,
R
.
id
.
clear_cache
,
R
.
id
.
recycler
,
R
.
id
.
recycler_2
,
R
.
id
.
list_detail_list
,
R
.
id
.
web_detail
})
@OnClick
({
R
.
id
.
open_btn
,
R
.
id
.
list_btn
,
R
.
id
.
list_btn_2
,
R
.
id
.
list_detail
,
R
.
id
.
clear_cache
,
R
.
id
.
recycler
,
R
.
id
.
recycler_2
,
R
.
id
.
list_detail_list
,
R
.
id
.
web_detail
,
R
.
id
.
danmaku_video
})
public
void
onClick
(
View
view
)
{
switch
(
view
.
getId
())
{
case
R
.
id
.
open_btn
:
...
...
@@ -62,6 +62,9 @@ public class MainActivity extends AppCompatActivity {
//播放一个连续列表
JumpUtils
.
gotoWebDetail
(
this
);
break
;
case
R
.
id
.
danmaku_video
:
//播放一个弹幕视频
JumpUtils
.
gotoDanmaku
(
this
);
case
R
.
id
.
clear_cache
:
//清理缓存
GSYVideoManager
.
clearAllDefaultCache
(
MainActivity
.
this
);
...
...
app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java
浏览文件 @
f7910cf3
...
...
@@ -7,6 +7,7 @@ import android.support.v4.app.ActivityOptionsCompat;
import
android.support.v4.util.Pair
;
import
android.view.View
;
import
com.example.gsyvideoplayer.DanmkuVideoActivity
;
import
com.example.gsyvideoplayer.DetailListPlayer
;
import
com.example.gsyvideoplayer.DetailPlayer
;
import
com.example.gsyvideoplayer.ListVideo2Activity
;
...
...
@@ -118,4 +119,14 @@ public class JumpUtils {
Intent
intent
=
new
Intent
(
activity
,
WebDetailActivity
.
class
);
activity
.
startActivity
(
intent
);
}
/**
* 跳转到弹幕
*
* @param activity
*/
public
static
void
gotoDanmaku
(
Activity
activity
)
{
Intent
intent
=
new
Intent
(
activity
,
DanmkuVideoActivity
.
class
);
activity
.
startActivity
(
intent
);
}
}
app/src/main/java/com/example/gsyvideoplayer/video/DanmakuVideoPlayer.java
浏览文件 @
f7910cf3
...
...
@@ -14,6 +14,7 @@ import android.util.Log;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.widget.SeekBar
;
import
android.widget.TextView
;
import
com.example.gsyvideoplayer.R
;
import
com.example.gsyvideoplayer.adapter.DanamakuAdapter
;
...
...
@@ -49,10 +50,13 @@ import master.flame.danmaku.ui.widget.DanmakuView;
/**
* Created by guoshuyu on 2017/2/16.
*
*
<p>
* 配置弹幕使用的播放器,目前使用的是本地模拟数据。
*
* 模拟数据的弹幕时常比较短,后面的时常点是没有数据的。
* <p>
* 模拟数据的弹幕时常比较短,后面的时长点是没有数据的。
* <p>
* 注意:这只是一个例子,演示如何集合弹幕,需要完善如弹出输入弹幕等的,可以自行完善。
* 注意:b站的弹幕so只有v5 v7 x86、没有64,所以记得配置上ndk过滤。
*/
public
class
DanmakuVideoPlayer
extends
StandardGSYVideoPlayer
{
...
...
@@ -61,8 +65,12 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
private
IDanmakuView
mDanmakuView
;
//弹幕view
private
DanmakuContext
mDanmakuContext
;
private
TextView
mSendDanmaku
,
mToogleDanmaku
;
private
long
mDanmakuStartSeekPosition
=
-
1
;
private
boolean
mDanmaKuShow
=
true
;
public
DanmakuVideoPlayer
(
Context
context
,
Boolean
fullFlag
)
{
super
(
context
,
fullFlag
);
}
...
...
@@ -85,52 +93,16 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
protected
void
init
(
Context
context
)
{
super
.
init
(
context
);
mDanmakuView
=
(
DanmakuView
)
findViewById
(
R
.
id
.
danmaku_view
);
mSendDanmaku
=
(
TextView
)
findViewById
(
R
.
id
.
send_danmaku
);
mToogleDanmaku
=
(
TextView
)
findViewById
(
R
.
id
.
toogle_danmaku
);
// 设置最大显示行数
HashMap
<
Integer
,
Integer
>
maxLinesPair
=
new
HashMap
<
Integer
,
Integer
>();
maxLinesPair
.
put
(
BaseDanmaku
.
TYPE_SCROLL_RL
,
5
);
// 滚动弹幕最大显示5行
// 设置是否禁止重叠
HashMap
<
Integer
,
Boolean
>
overlappingEnablePair
=
new
HashMap
<
Integer
,
Boolean
>();
overlappingEnablePair
.
put
(
BaseDanmaku
.
TYPE_SCROLL_RL
,
true
);
overlappingEnablePair
.
put
(
BaseDanmaku
.
TYPE_FIX_TOP
,
true
);
DanamakuAdapter
danamakuAdapter
=
new
DanamakuAdapter
(
mDanmakuView
);
mDanmakuContext
=
DanmakuContext
.
create
();
mDanmakuContext
.
setDanmakuStyle
(
IDisplayer
.
DANMAKU_STYLE_STROKEN
,
3
).
setDuplicateMergingEnabled
(
false
).
setScrollSpeedFactor
(
1.2f
).
setScaleTextSize
(
1.2f
)
.
setCacheStuffer
(
new
SpannedCacheStuffer
(),
danamakuAdapter
)
// 图文混排使用SpannedCacheStuffer
// .setCacheStuffer(new BackgroundCacheStuffer()) // 绘制背景使用BackgroundCacheStuffer
.
setMaximumLines
(
maxLinesPair
)
.
preventOverlapping
(
overlappingEnablePair
);
if
(
mDanmakuView
!=
null
)
{
//todo 替换成你的数据流
mParser
=
createParser
(
this
.
getResources
().
openRawResource
(
R
.
raw
.
comments
));
mDanmakuView
.
setCallback
(
new
master
.
flame
.
danmaku
.
controller
.
DrawHandler
.
Callback
()
{
@Override
public
void
updateTimer
(
DanmakuTimer
timer
)
{
}
@Override
public
void
drawingFinished
()
{
//初始化弹幕显示
initDanmaku
();
}
mSendDanmaku
.
setOnClickListener
(
this
);
mToogleDanmaku
.
setOnClickListener
(
this
);
@Override
public
void
danmakuShown
(
BaseDanmaku
danmaku
)
{
}
@Override
public
void
prepared
()
{
if
(
getDanmakuView
()
!=
null
)
{
getDanmakuView
().
start
();
if
(
getDanmakuStartSeekPosition
()
!=
-
1
)
{
resolveDanmakuSeek
(
DanmakuVideoPlayer
.
this
,
getDanmakuStartSeekPosition
());
setDanmakuStartSeekPosition
(-
1
);
}
}
}
});
mDanmakuView
.
enableDanmakuDrawingCache
(
true
);
}
}
@Override
...
...
@@ -158,9 +130,7 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
@Override
public
void
release
()
{
super
.
release
();
if
(
mDanmakuView
!=
null
)
{
mDanmakuView
.
release
();
}
releaseDanmaku
(
this
);
}
...
...
@@ -177,8 +147,23 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
}
}
@Override
public
void
onClick
(
View
v
)
{
super
.
onClick
(
v
);
switch
(
v
.
getId
())
{
case
R
.
id
.
send_danmaku
:
addDanmaku
(
true
);
break
;
case
R
.
id
.
toogle_danmaku
:
mDanmaKuShow
=
!
mDanmaKuShow
;
resolveDanmakuShow
();
break
;
}
}
/**
* 处理播放器在全屏切换时,弹幕显示的逻辑
* 需要格外注意的是,因为全屏和小屏,是切换了播放器,所以需要同步之间的弹幕状态
*/
@Override
public
GSYBaseVideoPlayer
startWindowFullscreen
(
Context
context
,
boolean
actionBar
,
boolean
statusBar
)
{
...
...
@@ -187,6 +172,7 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
DanmakuVideoPlayer
gsyVideoPlayer
=
(
DanmakuVideoPlayer
)
gsyBaseVideoPlayer
;
//对弹幕设置偏移记录
gsyVideoPlayer
.
setDanmakuStartSeekPosition
(
getCurrentPositionWhenPlaying
());
gsyVideoPlayer
.
setDanmaKuShow
(
getDanmaKuShow
());
onPrepareDanmaku
(
gsyVideoPlayer
);
}
return
gsyBaseVideoPlayer
;
...
...
@@ -194,19 +180,93 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
/**
* 处理播放器在退出全屏时,弹幕显示的逻辑
* 需要格外注意的是,因为全屏和小屏,是切换了播放器,所以需要同步之间的弹幕状态
*/
@Override
protected
void
resolveNormalVideoShow
(
View
oldF
,
ViewGroup
vp
,
GSYVideoPlayer
gsyVideoPlayer
)
{
super
.
resolveNormalVideoShow
(
oldF
,
vp
,
gsyVideoPlayer
);
if
(
gsyVideoPlayer
!=
null
)
{
DanmakuVideoPlayer
gsyDanmaVideoPlayer
=
(
DanmakuVideoPlayer
)
gsyVideoPlayer
;
setDanmaKuShow
(
gsyDanmaVideoPlayer
.
getDanmaKuShow
());
if
(
gsyDanmaVideoPlayer
.
getDanmakuView
()
!=
null
&&
gsyDanmaVideoPlayer
.
getDanmakuView
().
isPrepared
())
{
resolveDanmakuSeek
(
this
,
gsyDanmaVideoPlayer
.
getCurrentPositionWhenPlaying
());
resolveDanmakuShow
();
releaseDanmaku
(
gsyDanmaVideoPlayer
);
}
}
}
private
void
initDanmaku
()
{
// 设置最大显示行数
HashMap
<
Integer
,
Integer
>
maxLinesPair
=
new
HashMap
<
Integer
,
Integer
>();
maxLinesPair
.
put
(
BaseDanmaku
.
TYPE_SCROLL_RL
,
5
);
// 滚动弹幕最大显示5行
// 设置是否禁止重叠
HashMap
<
Integer
,
Boolean
>
overlappingEnablePair
=
new
HashMap
<
Integer
,
Boolean
>();
overlappingEnablePair
.
put
(
BaseDanmaku
.
TYPE_SCROLL_RL
,
true
);
overlappingEnablePair
.
put
(
BaseDanmaku
.
TYPE_FIX_TOP
,
true
);
DanamakuAdapter
danamakuAdapter
=
new
DanamakuAdapter
(
mDanmakuView
);
mDanmakuContext
=
DanmakuContext
.
create
();
mDanmakuContext
.
setDanmakuStyle
(
IDisplayer
.
DANMAKU_STYLE_STROKEN
,
3
).
setDuplicateMergingEnabled
(
false
).
setScrollSpeedFactor
(
1.2f
).
setScaleTextSize
(
1.2f
)
.
setCacheStuffer
(
new
SpannedCacheStuffer
(),
danamakuAdapter
)
// 图文混排使用SpannedCacheStuffer
.
setMaximumLines
(
maxLinesPair
)
.
preventOverlapping
(
overlappingEnablePair
);
if
(
mDanmakuView
!=
null
)
{
//todo 替换成你的数据流
mParser
=
createParser
(
this
.
getResources
().
openRawResource
(
R
.
raw
.
comments
));
mDanmakuView
.
setCallback
(
new
master
.
flame
.
danmaku
.
controller
.
DrawHandler
.
Callback
()
{
@Override
public
void
updateTimer
(
DanmakuTimer
timer
)
{
}
@Override
public
void
drawingFinished
()
{
}
@Override
public
void
danmakuShown
(
BaseDanmaku
danmaku
)
{
}
@Override
public
void
prepared
()
{
if
(
getDanmakuView
()
!=
null
)
{
getDanmakuView
().
start
();
if
(
getDanmakuStartSeekPosition
()
!=
-
1
)
{
resolveDanmakuSeek
(
DanmakuVideoPlayer
.
this
,
getDanmakuStartSeekPosition
());
setDanmakuStartSeekPosition
(-
1
);
}
resolveDanmakuShow
();
}
}
});
mDanmakuView
.
enableDanmakuDrawingCache
(
true
);
}
}
/**
* 弹幕的显示与关闭
*/
private
void
resolveDanmakuShow
()
{
post
(
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
mDanmaKuShow
)
{
if
(!
getDanmakuView
().
isShown
())
getDanmakuView
().
show
();
mToogleDanmaku
.
setText
(
"弹幕关"
);
}
else
{
if
(
getDanmakuView
().
isShown
())
{
getDanmakuView
().
hide
();
}
mToogleDanmaku
.
setText
(
"弹幕开"
);
}
}
});
}
/**
* 开始播放弹幕
*/
...
...
@@ -259,6 +319,15 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
}
/**
* 释放弹幕控件
*/
private
void
releaseDanmaku
(
DanmakuVideoPlayer
danmakuVideoPlayer
)
{
if
(
danmakuVideoPlayer
!=
null
&&
danmakuVideoPlayer
.
getDanmakuView
()
!=
null
)
{
danmakuVideoPlayer
.
getDanmakuView
().
release
();
}
}
public
BaseDanmakuParser
getParser
()
{
return
mParser
;
}
...
...
@@ -278,4 +347,34 @@ public class DanmakuVideoPlayer extends StandardGSYVideoPlayer {
public
void
setDanmakuStartSeekPosition
(
long
danmakuStartSeekPosition
)
{
this
.
mDanmakuStartSeekPosition
=
danmakuStartSeekPosition
;
}
public
void
setDanmaKuShow
(
boolean
danmaKuShow
)
{
mDanmaKuShow
=
danmaKuShow
;
}
public
boolean
getDanmaKuShow
()
{
return
mDanmaKuShow
;
}
/**
* 模拟添加弹幕数据
*/
private
void
addDanmaku
(
boolean
islive
)
{
BaseDanmaku
danmaku
=
mDanmakuContext
.
mDanmakuFactory
.
createDanmaku
(
BaseDanmaku
.
TYPE_SCROLL_RL
);
if
(
danmaku
==
null
||
mDanmakuView
==
null
)
{
return
;
}
danmaku
.
text
=
"这是一条弹幕 "
+
getCurrentPositionWhenPlaying
();
danmaku
.
padding
=
5
;
danmaku
.
priority
=
8
;
// 可能会被各种过滤器过滤并隐藏显示,所以提高等级
danmaku
.
isLive
=
islive
;
danmaku
.
setTime
(
mDanmakuView
.
getCurrentTime
()
+
500
);
danmaku
.
textSize
=
25
f
*
(
mParser
.
getDisplayer
().
getDensity
()
-
0.6f
);
danmaku
.
textColor
=
Color
.
RED
;
danmaku
.
textShadowColor
=
Color
.
WHITE
;
danmaku
.
borderColor
=
Color
.
GREEN
;
mDanmakuView
.
addDanmaku
(
danmaku
);
}
}
app/src/main/res/layout/activity_danmaku_layout.xml
0 → 100644
浏览文件 @
f7910cf3
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:id=
"@+id/activity_detail_player"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<android.support.v4.widget.NestedScrollView
android:id=
"@+id/post_detail_nested_scroll"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:fillViewport=
"true"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
>
<View
android:layout_width=
"match_parent"
android:layout_height=
"@dimen/post_media_height"
/>
<TextView
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"@string/detail_text"
android:textSize=
"16sp"
/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
<com.example.gsyvideoplayer.video.DanmakuVideoPlayer
android:id=
"@+id/danmaku_player"
android:layout_width=
"match_parent"
android:layout_height=
"@dimen/post_media_height"
/>
</RelativeLayout>
app/src/main/res/layout/activity_detail_player.xml
浏览文件 @
f7910cf3
...
...
@@ -29,7 +29,7 @@
</android.support.v4.widget.NestedScrollView>
<com.example.gsyvideoplayer.video.
DanmakuVideoPlayer
<com.example.gsyvideoplayer.video.
LandLayoutVideo
android:id=
"@+id/detail_player"
android:layout_width=
"match_parent"
android:layout_height=
"@dimen/post_media_height"
/>
...
...
app/src/main/res/layout/activity_main.xml
浏览文件 @
f7910cf3
...
...
@@ -54,7 +54,7 @@
android:layout_width=
"120dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"20dp"
android:text=
"Detail Video
2
"
/>
android:text=
"Detail Video"
/>
<Button
android:id=
"@+id/list_detail_list"
...
...
@@ -71,6 +71,14 @@
android:layout_marginTop=
"20dp"
android:text=
"web detail"
/>
<Button
android:id=
"@+id/danmaku_video"
android:layout_width=
"120dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"20dp"
android:text=
"Danmaku Video"
/>
<Button
android:id=
"@+id/clear_cache"
android:layout_width=
"120dp"
...
...
app/src/main/res/layout/danmaku_layout.xml
浏览文件 @
f7910cf3
...
...
@@ -41,51 +41,86 @@
<LinearLayout
android:id=
"@+id/layout_bottom"
android:layout_width=
"match_parent"
android:layout_height=
"
40dp
"
android:layout_height=
"
wrap_content
"
android:layout_alignParentBottom=
"true"
android:background=
"#99000000"
android:gravity=
"center_vertical"
android:orientation=
"
horizont
al"
android:orientation=
"
vertic
al"
android:visibility=
"invisible"
>
<TextView
android:id=
"@+id/current"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"16dp"
android:text=
"00:00"
android:textColor=
"#ffffff"
/>
<SeekBar
android:id=
"@+id/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=
"4dp"
android:minHeight=
"4dp"
android:paddingBottom=
"8dp"
android:paddingTop=
"8dp"
android:progressDrawable=
"@drawable/video_seek_progress"
android:thumb=
"@drawable/video_seek_thumb"
/>
<TextView
android:id=
"@+id/total"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginRight=
"16dp"
android:text=
"00:00"
android:textColor=
"#ffffff"
/>
<ImageView
android:id=
"@+id/fullscreen"
android:layout_width=
"wrap_content"
android:layout_height=
"fill_parent"
android:paddingRight=
"16dp"
android:scaleType=
"center"
android:src=
"@drawable/video_enlarge"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
android:gravity=
"center_vertical"
android:orientation=
"horizontal"
>
<TextView
android:id=
"@+id/current"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"16dp"
android:text=
"00:00"
android:textColor=
"#ffffff"
/>
<SeekBar
android:id=
"@+id/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=
"4dp"
android:minHeight=
"4dp"
android:paddingBottom=
"8dp"
android:paddingTop=
"8dp"
android:progressDrawable=
"@drawable/video_seek_progress"
android:thumb=
"@drawable/video_seek_thumb"
/>
<TextView
android:id=
"@+id/total"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginRight=
"16dp"
android:text=
"00:00"
android:textColor=
"#ffffff"
/>
<ImageView
android:id=
"@+id/fullscreen"
android:layout_width=
"wrap_content"
android:layout_height=
"match_parent"
android:paddingRight=
"10dp"
android:scaleType=
"center"
android:src=
"@drawable/video_enlarge"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"20dp"
android:layout_gravity=
"center"
android:orientation=
"horizontal"
>
<TextView
android:id=
"@+id/send_danmaku"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:background=
"#808080"
android:gravity=
"center"
android:text=
"发送弹幕"
android:textColor=
"#ffffff"
/>
<TextView
android:id=
"@+id/toogle_danmaku"
android:layout_width=
"50dp"
android:layout_height=
"match_parent"
android:layout_marginLeft=
"20dp"
android:gravity=
"center"
android:text=
"弹幕关"
android:textColor=
"#ffffff"
/>
</LinearLayout>
</LinearLayout>
<ProgressBar
...
...
@@ -163,7 +198,7 @@
android:layout_alignParentRight=
"true"
android:layout_centerVertical=
"true"
android:layout_marginRight=
"50dp"
android:visibility=
"gone"
android:scaleType=
"centerInside"
android:src=
"@drawable/unlock"
/>
android:src=
"@drawable/unlock"
android:visibility=
"gone"
/>
</RelativeLayout>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录