Skip to content

Commit e94c735

Browse files
committed
完善EventProducer、Touch分发
1 parent 856e965 commit e94c735

File tree

19 files changed

+520
-15
lines changed

19 files changed

+520
-15
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,18 @@ demo示例集成了播放控制组件**ControllerCover**、加载中组件**Load
8282
dependencies {
8383
//---------如果仅使用MediaPlayer解码,使用以下依赖。----------
8484
//该依赖仅包含MediaPlayer解码
85-
implementation 'com.kk.taurus.playerbase:playerbase:3.3.8'
85+
implementation 'com.kk.taurus.playerbase:playerbase:3.3.9'
8686
8787
8888
//---------如果使用ExoPlayer解码,使用以下依赖。---------
8989
//该依赖包含exoplayer解码和MediaPlayer解码
9090
//注意exoplayer的最小支持SDK版本为16
91-
implementation 'cn.jiajunhui:exoplayer:338_2117_014'
91+
implementation 'cn.jiajunhui:exoplayer:339_2118_015'
9292
9393
9494
//---------如果使用ijkPlayer解码,使用以下依赖。---------
9595
//该依赖包含ijkplayer解码和MediaPlayer解码
96-
implementation 'cn.jiajunhui:ijkplayer:338_088_009'
96+
implementation 'cn.jiajunhui:ijkplayer:339_088_010'
9797
//ijk官方的解码库依赖,较少格式版本且不支持HTTPS。
9898
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
9999
# Other ABIs: optional

app/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,8 @@ dependencies {
5252
implementation project(':exoplayer')
5353
implementation project(':ijkplayer')
5454
implementation 'com.google.android.material:material:1.0.0'
55+
56+
implementation 'com.github.ctiao:DanmakuFlameMaster:0.9.25'
57+
implementation 'com.github.ctiao:ndkbitmap-armv7a:0.9.21'
58+
5559
}

app/src/main/java/com/kk/taurus/avplayer/cover/ControllerCover.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ public View onCreateCoverView(Context context) {
476476

477477
@Override
478478
public int getCoverLevel() {
479-
return levelLow(1);
479+
return levelMedium(1);
480480
}
481481

482482
@Override
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package com.kk.taurus.avplayer.cover;
2+
3+
import android.content.Context;
4+
import android.graphics.Color;
5+
import android.os.Bundle;
6+
import android.view.LayoutInflater;
7+
import android.view.View;
8+
9+
import com.kk.taurus.avplayer.R;
10+
import com.kk.taurus.avplayer.play.DataInter;
11+
import com.kk.taurus.playerbase.event.EventKey;
12+
import com.kk.taurus.playerbase.event.OnPlayerEventListener;
13+
import com.kk.taurus.playerbase.log.PLog;
14+
import com.kk.taurus.playerbase.receiver.BaseCover;
15+
16+
import java.util.HashMap;
17+
18+
import master.flame.danmaku.controller.DrawHandler;
19+
import master.flame.danmaku.controller.IDanmakuView;
20+
import master.flame.danmaku.danmaku.model.BaseDanmaku;
21+
import master.flame.danmaku.danmaku.model.DanmakuTimer;
22+
import master.flame.danmaku.danmaku.model.IDisplayer;
23+
import master.flame.danmaku.danmaku.model.android.DanmakuContext;
24+
import master.flame.danmaku.danmaku.model.android.Danmakus;
25+
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
26+
27+
/**
28+
* @ClassName DanmuCover
29+
* @Description
30+
* @Author Taurus
31+
* @Date 2020/9/6 7:12 PM
32+
*/
33+
public class DanmuCover extends BaseCover {
34+
35+
private IDanmakuView mDanmakuView;
36+
private DanmakuContext mDanmakuContext;
37+
38+
public DanmuCover(Context context) {
39+
super(context);
40+
}
41+
42+
@Override
43+
public void onReceiverBind() {
44+
super.onReceiverBind();
45+
46+
mDanmakuView = findViewById(R.id.layout_danmu_cover_danmu_view);
47+
mDanmakuView.setCallback(new DrawHandler.Callback() {
48+
@Override
49+
public void prepared() {
50+
mDanmakuView.start();
51+
}
52+
@Override
53+
public void updateTimer(DanmakuTimer timer) {
54+
55+
}
56+
@Override
57+
public void danmakuShown(BaseDanmaku danmaku) {
58+
59+
}
60+
@Override
61+
public void drawingFinished() {
62+
63+
}
64+
});
65+
66+
HashMap<Integer, Integer> maxLinesPair = new HashMap<Integer, Integer>();
67+
maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 5); // 滚动弹幕最大显示5行
68+
// 设置是否禁止重叠
69+
HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<Integer, Boolean>();
70+
overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true);
71+
overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true);
72+
mDanmakuContext = DanmakuContext.create();
73+
mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setDuplicateMergingEnabled(false).setScrollSpeedFactor(1.2f).setScaleTextSize(1.2f)
74+
.setMaximumLines(maxLinesPair)
75+
.preventOverlapping(overlappingEnablePair).setDanmakuMargin(40);
76+
77+
mDanmakuView.prepare(new BaseDanmakuParser() {
78+
@Override
79+
protected Danmakus parse() {
80+
return new Danmakus();
81+
}
82+
}, mDanmakuContext);
83+
mDanmakuView.showFPS(true);
84+
mDanmakuView.enableDanmakuDrawingCache(true);
85+
}
86+
87+
@Override
88+
protected View onCreateCoverView(Context context) {
89+
return LayoutInflater.from(context).inflate(R.layout.layout_danmu_cover, null, false);
90+
}
91+
92+
@Override
93+
public int getCoverLevel() {
94+
return levelLow(1);
95+
}
96+
97+
@Override
98+
public void onPlayerEvent(int eventCode, Bundle bundle) {
99+
switch (eventCode){
100+
case OnPlayerEventListener.PLAYER_EVENT_ON_PAUSE:
101+
if (mDanmakuView != null && mDanmakuView.isPrepared()) {
102+
mDanmakuView.pause();
103+
}
104+
break;
105+
case OnPlayerEventListener.PLAYER_EVENT_ON_RESUME:
106+
if (mDanmakuView != null && mDanmakuView.isPrepared() && mDanmakuView.isPaused()) {
107+
mDanmakuView.resume();
108+
}
109+
break;
110+
case OnPlayerEventListener.PLAYER_EVENT_ON_DESTROY:
111+
if (mDanmakuView != null) {
112+
// dont forget release!
113+
mDanmakuView.release();
114+
mDanmakuView = null;
115+
}
116+
break;
117+
}
118+
}
119+
120+
@Override
121+
public void onErrorEvent(int eventCode, Bundle bundle) {
122+
if (mDanmakuView != null && mDanmakuView.isPrepared() && mDanmakuView.isPaused()) {
123+
mDanmakuView.resume();
124+
}
125+
}
126+
127+
@Override
128+
public void onReceiverEvent(int eventCode, Bundle bundle) {
129+
130+
}
131+
132+
@Override
133+
public void onProducerEvent(int eventCode, Bundle bundle) {
134+
super.onProducerEvent(eventCode, bundle);
135+
if(eventCode == DataInter.ProducerEvent.ADD_DANMU_DATA){
136+
PLog.d("DanmuTest_Receive", bundle.toString());
137+
int position = bundle.getInt(EventKey.INT_DATA);
138+
String text = bundle.getString(EventKey.STRING_DATA);
139+
addDanmaku(false, position, text);
140+
}
141+
}
142+
143+
private void addDanmaku(boolean islive, int position, String text) {
144+
if(mDanmakuContext==null)
145+
return;
146+
BaseDanmaku danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
147+
if (danmaku == null || mDanmakuView == null) {
148+
return;
149+
}
150+
// for(int i=0;i<100;i++){
151+
// }
152+
danmaku.text = text;
153+
danmaku.padding = 5;
154+
danmaku.priority = 0; // 可能会被各种过滤器过滤并隐藏显示
155+
danmaku.isLive = islive;
156+
danmaku.setTime(position + 1200);
157+
danmaku.textSize = 25f * (getContext().getResources().getDisplayMetrics().density - 0.6f);
158+
danmaku.textColor = Color.RED;
159+
danmaku.textShadowColor = Color.WHITE;
160+
// danmaku.underlineColor = Color.GREEN;
161+
danmaku.borderColor = Color.GREEN;
162+
mDanmakuView.addDanmaku(danmaku);
163+
164+
}
165+
166+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.kk.taurus.avplayer.event_producer;
2+
3+
import android.os.Bundle;
4+
import android.os.Handler;
5+
import android.os.Looper;
6+
import android.os.Message;
7+
8+
import androidx.annotation.Nullable;
9+
10+
import com.kk.taurus.avplayer.play.DataInter;
11+
import com.kk.taurus.avplayer.utils.RandomUtils;
12+
import com.kk.taurus.playerbase.event.BundlePool;
13+
import com.kk.taurus.playerbase.event.EventKey;
14+
import com.kk.taurus.playerbase.event.OnPlayerEventListener;
15+
import com.kk.taurus.playerbase.extension.BaseEventProducer;
16+
import com.kk.taurus.playerbase.extension.EventCallback;
17+
import com.kk.taurus.playerbase.log.PLog;
18+
19+
import java.util.Random;
20+
21+
/**
22+
* @ClassName DanmuDataProducer
23+
* @Description
24+
* @Author Taurus
25+
* @Date 2020/9/6 6:03 PM
26+
*/
27+
public class DanmuDataProducer extends BaseEventProducer {
28+
29+
private final int MSG_LOAD_DANMU_DATA = 100;
30+
31+
private final int LOAD_DANMU_DATA_PERIOD = 10 * 1000;
32+
33+
private int mCurrStartMs = 1;
34+
35+
private Handler mHandler = new Handler(Looper.getMainLooper()){
36+
@Override
37+
public void handleMessage(Message msg) {
38+
super.handleMessage(msg);
39+
if(getSender()==null || getPlayerStateGetter()==null)
40+
return;
41+
switch (msg.what){
42+
case MSG_LOAD_DANMU_DATA:
43+
if(msg.arg1 != 0){
44+
mCurrStartMs = msg.arg1;
45+
}
46+
final int count = new Random().nextInt(20);
47+
for(int i=0;i<count;i++){
48+
Bundle obtain = BundlePool.obtain();
49+
obtain.putInt(EventKey.INT_DATA, mCurrStartMs + (new Random().nextInt(10)*1000));
50+
obtain.putString(EventKey.STRING_DATA, RandomUtils.getRandomLowerLetterStr(RandomUtils.getRandomInt(3,20)));
51+
getSender().sendEvent(DataInter.ProducerEvent.ADD_DANMU_DATA, obtain);
52+
PLog.d("DanmuTest_Send", obtain.toString());
53+
}
54+
mCurrStartMs += LOAD_DANMU_DATA_PERIOD;
55+
mHandler.sendEmptyMessageDelayed(MSG_LOAD_DANMU_DATA, LOAD_DANMU_DATA_PERIOD);
56+
break;
57+
}
58+
}
59+
};
60+
61+
@Override
62+
public void onAdded() {
63+
64+
}
65+
66+
@Override
67+
public void onRemoved() {
68+
69+
}
70+
71+
@Override
72+
public void destroy() {
73+
74+
}
75+
76+
@Nullable
77+
@Override
78+
protected EventCallback getEventCallback() {
79+
return new EventCallback() {
80+
@Override
81+
public void onPlayerEvent(int eventCode, Bundle data) {
82+
switch (eventCode){
83+
case OnPlayerEventListener.PLAYER_EVENT_ON_PREPARED:
84+
mHandler.sendEmptyMessage(MSG_LOAD_DANMU_DATA);
85+
break;
86+
case OnPlayerEventListener.PLAYER_EVENT_ON_SEEK_COMPLETE:
87+
int seekTo = getPlayerStateGetter()!=null?getPlayerStateGetter().getCurrentPosition():-1;
88+
mHandler.removeMessages(MSG_LOAD_DANMU_DATA);
89+
Message obtain = Message.obtain();
90+
obtain.what = MSG_LOAD_DANMU_DATA;
91+
obtain.arg1 = seekTo;
92+
mHandler.sendMessage(obtain);
93+
break;
94+
case OnPlayerEventListener.PLAYER_EVENT_ON_STOP:
95+
case OnPlayerEventListener.PLAYER_EVENT_ON_RESET:
96+
case OnPlayerEventListener.PLAYER_EVENT_ON_DESTROY:
97+
case OnPlayerEventListener.PLAYER_EVENT_ON_DATA_SOURCE_SET:
98+
mHandler.removeMessages(MSG_LOAD_DANMU_DATA);
99+
break;
100+
}
101+
}
102+
@Override
103+
public void onErrorEvent(int eventCode, Bundle data) {
104+
mHandler.removeMessages(MSG_LOAD_DANMU_DATA);
105+
}
106+
@Override
107+
public void onReceiverEvent(int eventCode, Bundle data) {
108+
109+
}
110+
};
111+
}
112+
113+
}

app/src/main/java/com/kk/taurus/avplayer/play/DataInter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,17 @@ interface ReceiverKey{
4141
String KEY_COMPLETE_COVER = "complete_cover";
4242
String KEY_ERROR_COVER = "error_cover";
4343
String KEY_CLOSE_COVER = "close_cover";
44+
String KEY_DANMU_COVER = "danmu_cover";
4445
}
4546

4647
interface PrivateEvent{
4748
int EVENT_CODE_UPDATE_SEEK = -201;
4849
}
4950

51+
interface ProducerEvent{
52+
53+
int ADD_DANMU_DATA = -301;
54+
55+
}
56+
5057
}

app/src/main/java/com/kk/taurus/avplayer/ui/BaseVideoViewActivity.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import com.kk.taurus.avplayer.App;
1717
import com.kk.taurus.avplayer.R;
1818
import com.kk.taurus.avplayer.cover.ControllerCover;
19+
import com.kk.taurus.avplayer.cover.DanmuCover;
20+
import com.kk.taurus.avplayer.event_producer.DanmuDataProducer;
1921
import com.kk.taurus.avplayer.play.DataInter;
2022
import com.kk.taurus.avplayer.play.ReceiverGroupManager;
2123
import com.kk.taurus.avplayer.utils.DataUtils;
@@ -71,11 +73,16 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
7173
updateVideo(false);
7274

7375
mReceiverGroup = ReceiverGroupManager.get().getReceiverGroup(this);
76+
//添加弹幕cover
77+
mReceiverGroup.addReceiver(DataInter.ReceiverKey.KEY_DANMU_COVER, new DanmuCover(this));
7478
mReceiverGroup.getGroupValue().putBoolean(DataInter.Key.KEY_CONTROLLER_TOP_ENABLE, true);
7579
mVideoView.setReceiverGroup(mReceiverGroup);
7680
mVideoView.setEventHandler(onVideoViewEventHandler);
7781
mVideoView.setOnPlayerEventListener(this);
7882

83+
//添加弹幕数据生产者
84+
mVideoView.getSuperContainer().addEventProducer(new DanmuDataProducer());
85+
7986
mVideoView.setVolume(mVolumeLeft, mVolumeRight);
8087
}
8188

0 commit comments

Comments
 (0)