本文实例为大家分享了Android实现弹幕效果的具体代码,供大家参考,具体内容如下
首先分析一下,他是由三层布局来共同完成的,第一层视频布局,第二层字幕布局,第三层输入框布局,要想让这三个布局在同一页面上,必须用相对布局或帧布局。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<? xml version = "1.0" encoding = "utf-8" ?> < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:app = "http://schemas.android.com/apk/res-auto" xmlns:tools = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" android:id = "@+id/activity_main" tools:context = "com.bwie.danmustudy.MainActivity" > < VideoView android:id = "@+id/video_view" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_centerInParent = "true" /> < master.flame.danmaku.ui.widget.DanmakuView android:id = "@+id/danmaku_view" android:layout_width = "match_parent" android:layout_height = "match_parent" /> < LinearLayout android:id = "@+id/operation_text" android:layout_width = "match_parent" android:layout_height = "50dp" android:layout_alignParentBottom = "true" android:visibility = "gone" android:background = "#fff" android:orientation = "horizontal" > < EditText android:id = "@+id/edit_text" android:layout_weight = "1" android:layout_width = "0dp" android:layout_height = "match_parent" /> < Button android:id = "@+id/send" android:text = "send" android:layout_width = "wrap_content" android:layout_height = "match_parent" /> </ LinearLayout > </ RelativeLayout > |
创建一个弹幕的解析器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
public class MainActivity extends AppCompatActivity { private boolean showDanmaku; private DanmakuView danmakuView; private DanmakuContext danmakuContext; //创建一个弹幕的解析器 private BaseDanmakuParser parser= new BaseDanmakuParser() { @Override protected IDanmakus parse() { return new Danmakus(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); //播放视频 VideoView video_view= (VideoView) findViewById(R.id.video_view); Uri uri=Uri.parse( "android.resource://" +getPackageName()+ "/" +R.raw.minion_08); video_view.setVideoURI(uri); video_view.start(); danmakuView= (DanmakuView) findViewById(R.id.danmaku_view); //调用了enableDanmakuDrawingCache()方法来提升绘制效率,也就是绘制速度 // 又调用了setCallback()方法来设置回调函数。 danmakuView.enableDanmakuDrawingCache( true ); danmakuView.setCallback( new DrawHandler.Callback() { @Override public void prepared() { showDanmaku= true ; danmakuView.start(); } @Override public void updateTimer(DanmakuTimer timer) { } @Override public void danmakuShown(BaseDanmaku danmaku) { } @Override public void drawingFinished() { } }); danmakuContext=danmakuContext.create(); //第一个参数是弹幕的解析器 //调用DanmakuView的prepare()方法来进行准备,准备完成后会自动调用刚才设置的回调函数中的prepared()方法 danmakuView.prepare(parser,danmakuContext); final LinearLayout operationLayout= (LinearLayout) findViewById(R.id.operation_text); final Button send= (Button) findViewById(R.id.send); final EditText edit_text= (EditText) findViewById(R.id.edit_text); danmakuView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { if (operationLayout.getVisibility()==View.GONE){ operationLayout.setVisibility(View.VISIBLE); } else { operationLayout.setVisibility(View.GONE); } } }); send.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { String content=edit_text.getText().toString(); if (!TextUtils.isEmpty(content)){ addDanmaku(content, true ); edit_text.setText( "" ); } } }); } @Override public void onWindowFocusChanged( boolean hasFocus) { super .onWindowFocusChanged(hasFocus); if (hasFocus&& Build.VERSION.SDK_INT>= 19 ){ View decorView=getWindow().getDecorView(); decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_FULLSCREEN |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); } } private void addDanmaku(String content, boolean withBorder){ BaseDanmaku danmaku=danmakuContext.mDanmakuFactory .createDanmaku(BaseDanmaku.TYPE_SCROLL_RL); danmaku.text=content; danmaku.padding= 5 ; danmaku.textSize= 50 ; danmaku.setTime(danmakuView.getCurrentTime()); if (withBorder){ danmakuView.addDanmaku(danmaku); } } |
最后使页面横屏展示:
1
2
3
4
5
6
7
8
9
10
|
< activity android:name = ".MainActivity" 只需要加这一行代码就可以 android:screenOrientation = "landscape" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_40441190/article/details/78519203