关于弹幕+1好还是弹幕伤害+40%好还是弹幕剑圣是攻速还是伤害15%好

2130人阅读
JAVA(33)
首先我们来看一下斗鱼上的弹幕效果,如下图所示:
这是一个Dota2游戏直播的界面,我们可以看到,在游戏界面的上方有很多的弹幕,看直播的观众们就是在这里进行讨论的。
那么这样的一个界面该如何实现呢?其实并不复杂,我们只需要首先在布局中放置一个显示游戏界面的View,然后在游戏界面的上方再覆盖一个显示弹幕的View就可以了。弹幕的View必须要做成完全透明的,这样即使覆盖在游戏界面的上方也不会影响到游戏的正常观看,只有当有人发弹幕消息时,再将消息绘制到弹幕的View上面就可以了。原理示意图如下所示:
但是我们除了要能看到弹幕之外也要能发弹幕才行,因此还要再在弹幕的View上面再覆盖一个操作界面的View,然后我们就可以在操作界面上发弹幕、送礼物等。原理示意图如下所示:
这样我们就把基本的实现原理分析完了,下面就让我们开始一步步实现吧。
实现视频播放
由于本篇文章的主题是实现弹幕效果,并不涉及直播的任何其他功能,因此这里我们就简单地使用VideoView播放一个本地视频来模拟最底层的游戏界面。
首先使用Android Studio新建一个DanmuTest项目,然后修改activity_main.xml中的代码,如下所示:
&code class=&language-xml hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&RelativeLayout
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&xmlns:android&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&/apk/res/android&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/activity_main&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:background&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&#000&&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&VideoView
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/video_view&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&wrap_content&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_centerInParent&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&true&&/span&/&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&RelativeLayout&/span&&&/span&&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&/ul&
布局文件的代码非常简单,只有一个VideoView,我们将它设置为居中显示。&
然后修改MainActivity中的代码,如下所示:
&code class=&language-java hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-class& style=&box-sizing: border-&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&class&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&MainActivity&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&extends&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&AppCompatActivity&/span& {&/span&
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onCreate&/span&(Bundle savedInstanceState) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VideoView videoView = (VideoView) findViewById(R.id.video_view);
videoView.setVideoPath(Environment.getExternalStorageDirectory() + &span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&&/Pixels.mp4&&/span&);
videoView.start();
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onWindowFocusChanged&/span&(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&boolean&/span& hasFocus) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onWindowFocusChanged(hasFocus);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (hasFocus && Build.VERSION.SDK_INT &= &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&19&/span&) {
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);
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&/ul&
上面的代码中使用了VideoView的最基本用法。在onCreate()方法中获取到了VideoView的实例,给它设置了一个视频文件的地址,然后调用start()方法开始播放。当然,我事先已经在SD的根目录中准备了一个叫Pixels.mp4的视频文件。
这里使用到了SD卡的功能,但是为了代码简单起见,我并没有加入运行时权限的处理,因此一定要记得将你的项目的targetSdkVersion指定成23以下。
另外,为了让视频播放可以有最好的体验效果,这里使用了沉浸式模式的写法。对沉浸式模式还不理解的朋友可以参考我的上一篇文章&&。
最后,我们在AndroidManifest.xml中将Activity设置为横屏显示并加入权限声明,如下所示:
&code class=&language-xml hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&manifest&/span& &span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&xmlns:android&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&/apk/res/android&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&package&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&com.example.guolin.danmutest&&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&uses-permission&/span& &span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:name&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&android.permission.WRITE_EXTERNAL_STORAGE&&/span& /&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&application
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:allowBackup&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&true&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:icon&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@mipmap/ic_launcher&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:label&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@string/app_name&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:supportsRtl&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&true&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:theme&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@style/AppTheme&&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&activity&/span& &span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:name&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&.MainActivity&&/span& &span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:screenOrientation&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&landscape&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:configChanges&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&orientation|keyboardHidden|screenLayout|screenSize&&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&intent-filter&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&action&/span& &span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:name&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&android.intent.action.MAIN&&/span&/&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&category&/span& &span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:name&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&android.intent.category.LAUNCHER&&/span&/&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&intent-filter&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&activity&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&application&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&manifest&/span&&&/span&&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&/ul&
OK,现在可以运行一下项目了,程序启动之后就会自动开始播放视频,效果如下图所示:
这样我们就把第一步的功能实现了。
实现弹幕效果
接下来我们开始实现弹幕效果。弹幕其实也就是一个自定义的View,它的上面可以显示类似于跑马灯的文字效果。观众们发表的评论都会在弹幕上显示出来,但又会很快地移出屏幕,既可以起到互动的作用,同时又不会影响视频的正常观看。
我们可以自己来编写这样的一个自定义View,当然也可以直接使用网上现成的开源项目。那么为了能够简单快速地实现弹幕效果,这里我就准备直接使用由哔哩哔哩开源的弹幕效果库DanmakuFlameMaster了。
DanmakuFlameMaster库的项目主页地址是:
话说现在使用Android Studio来引入一些开源库真的非常方便,只需要在build.gradle文件里面添加开源库的依赖就可以了。那么我们修改app/build.gradle文件,并在dependencies闭包中添加如下依赖:
&code class=&language-groovy hljs rust has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&dependencies {
compile fileTree(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&dir&/span&: &span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&'libs'&/span&, include: [&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&'*.jar'&/span&])
compile &span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&'com.android.support:appcompat-v7:24.2.1'&/span&
testCompile &span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&'junit:junit:4.12'&/span&
compile &span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&'com.github.ctiao:DanmakuFlameMaster:0.5.3'&/span&
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&/ul&
这样我们就将DanmakuFlameMaster库引入到当前项目中了。然后修改activity_main.xml中的代码,如下所示:
&code class=&language-xml hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&RelativeLayout
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&xmlns:android&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&/apk/res/android&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/activity_main&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:background&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&#000&&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&VideoView
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/video_view&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&wrap_content&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_centerInParent&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&true&&/span&/&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&master.flame.danmaku.ui.widget.DanmakuView
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/danmaku_view&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span& /&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&RelativeLayout&/span&&&/span&&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&/ul&
可以看到,这里在RelativeLayout中加入了一个DanmakuView控件,这个控件就是用于显示弹幕信息的了。注意一定要将DanmakuView写在VideoView的下面,因为RelativeLayout中后添加的控件会被覆盖在上面。
接下来修改MainActivity中的代码,我们在这里加入弹幕显示的逻辑,如下所示:
&code class=&language-java hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-class& style=&box-sizing: border-&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&class&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&MainActivity&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&extends&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&AppCompatActivity&/span& {&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&boolean&/span& showD
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& DanmakuView danmakuV
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& DanmakuContext danmakuC
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& BaseDanmakuParser parser = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& BaseDanmakuParser() {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& IDanmakus &span class=&hljs-title& style=&box-sizing: border-&&parse&/span&() {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&return&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Danmakus();
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onCreate&/span&(Bundle savedInstanceState) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VideoView videoView = (VideoView) findViewById(R.id.video_view);
videoView.setVideoPath(Environment.getExternalStorageDirectory() + &span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&&/Pixels.mp4&&/span&);
videoView.start();
danmakuView = (DanmakuView) findViewById(R.id.danmaku_view);
danmakuView.enableDanmakuDrawingCache(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&true&/span&);
danmakuView.setCallback(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& DrawHandler.Callback() {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&prepared&/span&() {
showDanmaku = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&true&/span&;
danmakuView.start();
generateSomeDanmaku();
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&updateTimer&/span&(DanmakuTimer timer) {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&danmakuShown&/span&(BaseDanmaku danmaku) {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&drawingFinished&/span&() {
danmakuContext = DanmakuContext.create();
danmakuView.prepare(parser, danmakuContext);
&span class=&hljs-javadoc& style=&color: rgb(136, 0, 0); box-sizing: border-&&/**
* 向弹幕View中添加一条弹幕
*&span class=&hljs-javadoctag& style=&color: rgb(102, 0, 102); box-sizing: border-&& @param&/span& content
弹幕的具体内容
*&span class=&hljs-javadoctag& style=&color: rgb(102, 0, 102); box-sizing: border-&& @param&/span&
withBorder
弹幕是否有边框
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&addDanmaku&/span&(String content, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&boolean&/span& withBorder) {
BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
danmaku.text =
danmaku.padding = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&5&/span&;
danmaku.textSize = sp2px(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&20&/span&);
danmaku.textColor = Color.WHITE;
danmaku.setTime(danmakuView.getCurrentTime());
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (withBorder) {
danmaku.borderColor = Color.GREEN;
danmakuView.addDanmaku(danmaku);
&span class=&hljs-javadoc& style=&color: rgb(136, 0, 0); box-sizing: border-&&/**
* 随机生成一些弹幕内容以供测试
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&generateSomeDanmaku&/span&() {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Thread(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Runnable() {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&run&/span&() {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&while&/span&(showDanmaku) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& time = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Random().nextInt(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&300&/span&);
String content = &span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&&&&/span& + time +
addDanmaku(content, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&false&/span&);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&try&/span& {
Thread.sleep(time);
} &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&catch&/span& (InterruptedException e) {
e.printStackTrace();
}).start();
&span class=&hljs-javadoc& style=&color: rgb(136, 0, 0); box-sizing: border-&&/**
* sp转px的方法。
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& &span class=&hljs-title& style=&box-sizing: border-&&sp2px&/span&(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& spValue) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&final&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& fontScale = getResources().getDisplayMetrics().scaledD
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&return&/span& (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&) (spValue * fontScale + &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0.5&/span&f);
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onPause&/span&() {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onPause();
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (danmakuView != &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&null&/span& && danmakuView.isPrepared()) {
danmakuView.pause();
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onResume&/span&() {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onResume();
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (danmakuView != &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&null&/span& && danmakuView.isPrepared() && danmakuView.isPaused()) {
danmakuView.resume();
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onDestroy&/span&() {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onDestroy();
showDanmaku = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&false&/span&;
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (danmakuView != &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&null&/span&) {
danmakuView.release();
danmakuView = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&null&/span&;
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&li style=&box-sizing: border- padding: 0px 5&&29&/li&&li style=&box-sizing: border- padding: 0px 5&&30&/li&&li style=&box-sizing: border- padding: 0px 5&&31&/li&&li style=&box-sizing: border- padding: 0px 5&&32&/li&&li style=&box-sizing: border- padding: 0px 5&&33&/li&&li style=&box-sizing: border- padding: 0px 5&&34&/li&&li style=&box-sizing: border- padding: 0px 5&&35&/li&&li style=&box-sizing: border- padding: 0px 5&&36&/li&&li style=&box-sizing: border- padding: 0px 5&&37&/li&&li style=&box-sizing: border- padding: 0px 5&&38&/li&&li style=&box-sizing: border- padding: 0px 5&&39&/li&&li style=&box-sizing: border- padding: 0px 5&&40&/li&&li style=&box-sizing: border- padding: 0px 5&&41&/li&&li style=&box-sizing: border- padding: 0px 5&&42&/li&&li style=&box-sizing: border- padding: 0px 5&&43&/li&&li style=&box-sizing: border- padding: 0px 5&&44&/li&&li style=&box-sizing: border- padding: 0px 5&&45&/li&&li style=&box-sizing: border- padding: 0px 5&&46&/li&&li style=&box-sizing: border- padding: 0px 5&&47&/li&&li style=&box-sizing: border- padding: 0px 5&&48&/li&&li style=&box-sizing: border- padding: 0px 5&&49&/li&&li style=&box-sizing: border- padding: 0px 5&&50&/li&&li style=&box-sizing: border- padding: 0px 5&&51&/li&&li style=&box-sizing: border- padding: 0px 5&&52&/li&&li style=&box-sizing: border- padding: 0px 5&&53&/li&&li style=&box-sizing: border- padding: 0px 5&&54&/li&&li style=&box-sizing: border- padding: 0px 5&&55&/li&&li style=&box-sizing: border- padding: 0px 5&&56&/li&&li style=&box-sizing: border- padding: 0px 5&&57&/li&&li style=&box-sizing: border- padding: 0px 5&&58&/li&&li style=&box-sizing: border- padding: 0px 5&&59&/li&&li style=&box-sizing: border- padding: 0px 5&&60&/li&&li style=&box-sizing: border- padding: 0px 5&&61&/li&&li style=&box-sizing: border- padding: 0px 5&&62&/li&&li style=&box-sizing: border- padding: 0px 5&&63&/li&&li style=&box-sizing: border- padding: 0px 5&&64&/li&&li style=&box-sizing: border- padding: 0px 5&&65&/li&&li style=&box-sizing: border- padding: 0px 5&&66&/li&&li style=&box-sizing: border- padding: 0px 5&&67&/li&&li style=&box-sizing: border- padding: 0px 5&&68&/li&&li style=&box-sizing: border- padding: 0px 5&&69&/li&&li style=&box-sizing: border- padding: 0px 5&&70&/li&&li style=&box-sizing: border- padding: 0px 5&&71&/li&&li style=&box-sizing: border- padding: 0px 5&&72&/li&&li style=&box-sizing: border- padding: 0px 5&&73&/li&&li style=&box-sizing: border- padding: 0px 5&&74&/li&&li style=&box-sizing: border- padding: 0px 5&&75&/li&&li style=&box-sizing: border- padding: 0px 5&&76&/li&&li style=&box-sizing: border- padding: 0px 5&&77&/li&&li style=&box-sizing: border- padding: 0px 5&&78&/li&&li style=&box-sizing: border- padding: 0px 5&&79&/li&&li style=&box-sizing: border- padding: 0px 5&&80&/li&&li style=&box-sizing: border- padding: 0px 5&&81&/li&&li style=&box-sizing: border- padding: 0px 5&&82&/li&&li style=&box-sizing: border- padding: 0px 5&&83&/li&&li style=&box-sizing: border- padding: 0px 5&&84&/li&&li style=&box-sizing: border- padding: 0px 5&&85&/li&&li style=&box-sizing: border- padding: 0px 5&&86&/li&&li style=&box-sizing: border- padding: 0px 5&&87&/li&&li style=&box-sizing: border- padding: 0px 5&&88&/li&&li style=&box-sizing: border- padding: 0px 5&&89&/li&&li style=&box-sizing: border- padding: 0px 5&&90&/li&&li style=&box-sizing: border- padding: 0px 5&&91&/li&&li style=&box-sizing: border- padding: 0px 5&&92&/li&&li style=&box-sizing: border- padding: 0px 5&&93&/li&&li style=&box-sizing: border- padding: 0px 5&&94&/li&&li style=&box-sizing: border- padding: 0px 5&&95&/li&&li style=&box-sizing: border- padding: 0px 5&&96&/li&&li style=&box-sizing: border- padding: 0px 5&&97&/li&&li style=&box-sizing: border- padding: 0px 5&&98&/li&&li style=&box-sizing: border- padding: 0px 5&&99&/li&&li style=&box-sizing: border- padding: 0px 5&&100&/li&&li style=&box-sizing: border- padding: 0px 5&&101&/li&&li style=&box-sizing: border- padding: 0px 5&&102&/li&&li style=&box-sizing: border- padding: 0px 5&&103&/li&&li style=&box-sizing: border- padding: 0px 5&&104&/li&&li style=&box-sizing: border- padding: 0px 5&&105&/li&&li style=&box-sizing: border- padding: 0px 5&&106&/li&&li style=&box-sizing: border- padding: 0px 5&&107&/li&&li style=&box-sizing: border- padding: 0px 5&&108&/li&&li style=&box-sizing: border- padding: 0px 5&&109&/li&&li style=&box-sizing: border- padding: 0px 5&&110&/li&&li style=&box-sizing: border- padding: 0px 5&&111&/li&&li style=&box-sizing: border- padding: 0px 5&&112&/li&&li style=&box-sizing: border- padding: 0px 5&&113&/li&&li style=&box-sizing: border- padding: 0px 5&&114&/li&&li style=&box-sizing: border- padding: 0px 5&&115&/li&&li style=&box-sizing: border- padding: 0px 5&&116&/li&&li style=&box-sizing: border- padding: 0px 5&&117&/li&&li style=&box-sizing: border- padding: 0px 5&&118&/li&&li style=&box-sizing: border- padding: 0px 5&&119&/li&&li style=&box-sizing: border- padding: 0px 5&&120&/li&&li style=&box-sizing: border- padding: 0px 5&&121&/li&&li style=&box-sizing: border- padding: 0px 5&&122&/li&&li style=&box-sizing: border- padding: 0px 5&&123&/li&&li style=&box-sizing: border- padding: 0px 5&&124&/li&&li style=&box-sizing: border- padding: 0px 5&&125&/li&&li style=&box-sizing: border- padding: 0px 5&&126&/li&&li style=&box-sizing: border- padding: 0px 5&&127&/li&&li style=&box-sizing: border- padding: 0px 5&&128&/li&&li style=&box-sizing: border- padding: 0px 5&&129&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&li style=&box-sizing: border- padding: 0px 5&&29&/li&&li style=&box-sizing: border- padding: 0px 5&&30&/li&&li style=&box-sizing: border- padding: 0px 5&&31&/li&&li style=&box-sizing: border- padding: 0px 5&&32&/li&&li style=&box-sizing: border- padding: 0px 5&&33&/li&&li style=&box-sizing: border- padding: 0px 5&&34&/li&&li style=&box-sizing: border- padding: 0px 5&&35&/li&&li style=&box-sizing: border- padding: 0px 5&&36&/li&&li style=&box-sizing: border- padding: 0px 5&&37&/li&&li style=&box-sizing: border- padding: 0px 5&&38&/li&&li style=&box-sizing: border- padding: 0px 5&&39&/li&&li style=&box-sizing: border- padding: 0px 5&&40&/li&&li style=&box-sizing: border- padding: 0px 5&&41&/li&&li style=&box-sizing: border- padding: 0px 5&&42&/li&&li style=&box-sizing: border- padding: 0px 5&&43&/li&&li style=&box-sizing: border- padding: 0px 5&&44&/li&&li style=&box-sizing: border- padding: 0px 5&&45&/li&&li style=&box-sizing: border- padding: 0px 5&&46&/li&&li style=&box-sizing: border- padding: 0px 5&&47&/li&&li style=&box-sizing: border- padding: 0px 5&&48&/li&&li style=&box-sizing: border- padding: 0px 5&&49&/li&&li style=&box-sizing: border- padding: 0px 5&&50&/li&&li style=&box-sizing: border- padding: 0px 5&&51&/li&&li style=&box-sizing: border- padding: 0px 5&&52&/li&&li style=&box-sizing: border- padding: 0px 5&&53&/li&&li style=&box-sizing: border- padding: 0px 5&&54&/li&&li style=&box-sizing: border- padding: 0px 5&&55&/li&&li style=&box-sizing: border- padding: 0px 5&&56&/li&&li style=&box-sizing: border- padding: 0px 5&&57&/li&&li style=&box-sizing: border- padding: 0px 5&&58&/li&&li style=&box-sizing: border- padding: 0px 5&&59&/li&&li style=&box-sizing: border- padding: 0px 5&&60&/li&&li style=&box-sizing: border- padding: 0px 5&&61&/li&&li style=&box-sizing: border- padding: 0px 5&&62&/li&&li style=&box-sizing: border- padding: 0px 5&&63&/li&&li style=&box-sizing: border- padding: 0px 5&&64&/li&&li style=&box-sizing: border- padding: 0px 5&&65&/li&&li style=&box-sizing: border- padding: 0px 5&&66&/li&&li style=&box-sizing: border- padding: 0px 5&&67&/li&&li style=&box-sizing: border- padding: 0px 5&&68&/li&&li style=&box-sizing: border- padding: 0px 5&&69&/li&&li style=&box-sizing: border- padding: 0px 5&&70&/li&&li style=&box-sizing: border- padding: 0px 5&&71&/li&&li style=&box-sizing: border- padding: 0px 5&&72&/li&&li style=&box-sizing: border- padding: 0px 5&&73&/li&&li style=&box-sizing: border- padding: 0px 5&&74&/li&&li style=&box-sizing: border- padding: 0px 5&&75&/li&&li style=&box-sizing: border- padding: 0px 5&&76&/li&&li style=&box-sizing: border- padding: 0px 5&&77&/li&&li style=&box-sizing: border- padding: 0px 5&&78&/li&&li style=&box-sizing: border- padding: 0px 5&&79&/li&&li style=&box-sizing: border- padding: 0px 5&&80&/li&&li style=&box-sizing: border- padding: 0px 5&&81&/li&&li style=&box-sizing: border- padding: 0px 5&&82&/li&&li style=&box-sizing: border- padding: 0px 5&&83&/li&&li style=&box-sizing: border- padding: 0px 5&&84&/li&&li style=&box-sizing: border- padding: 0px 5&&85&/li&&li style=&box-sizing: border- padding: 0px 5&&86&/li&&li style=&box-sizing: border- padding: 0px 5&&87&/li&&li style=&box-sizing: border- padding: 0px 5&&88&/li&&li style=&box-sizing: border- padding: 0px 5&&89&/li&&li style=&box-sizing: border- padding: 0px 5&&90&/li&&li style=&box-sizing: border- padding: 0px 5&&91&/li&&li style=&box-sizing: border- padding: 0px 5&&92&/li&&li style=&box-sizing: border- padding: 0px 5&&93&/li&&li style=&box-sizing: border- padding: 0px 5&&94&/li&&li style=&box-sizing: border- padding: 0px 5&&95&/li&&li style=&box-sizing: border- padding: 0px 5&&96&/li&&li style=&box-sizing: border- padding: 0px 5&&97&/li&&li style=&box-sizing: border- padding: 0px 5&&98&/li&&li style=&box-sizing: border- padding: 0px 5&&99&/li&&li style=&box-sizing: border- padding: 0px 5&&100&/li&&li style=&box-sizing: border- padding: 0px 5&&101&/li&&li style=&box-sizing: border- padding: 0px 5&&102&/li&&li style=&box-sizing: border- padding: 0px 5&&103&/li&&li style=&box-sizing: border- padding: 0px 5&&104&/li&&li style=&box-sizing: border- padding: 0px 5&&105&/li&&li style=&box-sizing: border- padding: 0px 5&&106&/li&&li style=&box-sizing: border- padding: 0px 5&&107&/li&&li style=&box-sizing: border- padding: 0px 5&&108&/li&&li style=&box-sizing: border- padding: 0px 5&&109&/li&&li style=&box-sizing: border- padding: 0px 5&&110&/li&&li style=&box-sizing: border- padding: 0px 5&&111&/li&&li style=&box-sizing: border- padding: 0px 5&&112&/li&&li style=&box-sizing: border- padding: 0px 5&&113&/li&&li style=&box-sizing: border- padding: 0px 5&&114&/li&&li style=&box-sizing: border- padding: 0px 5&&115&/li&&li style=&box-sizing: border- padding: 0px 5&&116&/li&&li style=&box-sizing: border- padding: 0px 5&&117&/li&&li style=&box-sizing: border- padding: 0px 5&&118&/li&&li style=&box-sizing: border- padding: 0px 5&&119&/li&&li style=&box-sizing: border- padding: 0px 5&&120&/li&&li style=&box-sizing: border- padding: 0px 5&&121&/li&&li style=&box-sizing: border- padding: 0px 5&&122&/li&&li style=&box-sizing: border- padding: 0px 5&&123&/li&&li style=&box-sizing: border- padding: 0px 5&&124&/li&&li style=&box-sizing: border- padding: 0px 5&&125&/li&&li style=&box-sizing: border- padding: 0px 5&&126&/li&&li style=&box-sizing: border- padding: 0px 5&&127&/li&&li style=&box-sizing: border- padding: 0px 5&&128&/li&&li style=&box-sizing: border- padding: 0px 5&&129&/li&&/ul&
可以看到,在onCreate()方法中我们先是获取到了DanmakuView控件的实例,然后调用了enableDanmakuDrawingCache()方法来提升绘制效率,又调用了setCallback()方法来设置回调函数。
接着调用DanmakuContext.create()方法创建了一个DanmakuContext的实例,DanmakuContext可以用于对弹幕的各种全局配置进行设定,如设置字体、设置最大显示行数等。这里我们并没有什么特殊的要求,因此一切都保持默认。
另外我们还需要创建一个弹幕的解析器才行,这里直接创建了一个全局的BaseDanmakuParser。
有了DanmakuContext和BaseDanmakuParser,接下来我们就可以调用DanmakuView的prepare()方法来进行准备,准备完成后会自动调用刚才设置的回调函数中的prepared()方法,然后我们在这里再调用DanmakuView的start()方法,这样DanmakuView就可以开始正常工作了。
虽说DanmakuView已经在正常工作了,但是屏幕上没有任何弹幕信息的话我们也看不出效果,因此我们还要增加一个添加弹幕消息的功能。
观察addDanmaku()方法,这个方法就是用于向DanmakuView中添加一条弹幕消息的。其中首先调用了createDanmaku()方法来创建一个BaseDanmaku实例,TYPE_SCROLL_RL表示这是一条从右向左滚动的弹幕,然后我们就可以对弹幕的内容、字体大小、颜色、显示时间等各种细节进行配置了。注意addDanmaku()方法中有一个withBorder参数,这个参数用于指定弹幕消息是否带有边框,这样才好将自己发送的弹幕和别人发送的弹幕进行区分。
这样我们就把最基本的弹幕功能就完成了,现在只需要当在接收到别人发送的弹幕消息时,调用addDanmaku()方法将这条弹幕添加到DanmakuView上就可以了。但接收别人发送来的消息又涉及到了即时通讯技术,显然这一篇文章中不可能将复杂的即时通讯技术也进行讲解,因此这里我专门写了一个generateSomeDanmaku()方法来随机生成一些弹幕消息,这样就可以模拟出和斗鱼类似的弹幕效果了。
除此之外,我们还需要在onPause()、onResume()、onDestroy()方法中进行一些逻辑处理,以保证DanmakuView的资源可以得到释放。
现在重新运行一下程序,效果如下图所示:
这样我们就把第二步的功能也实现了。
加入操作界面
那么下面我们开始进行第三步功能实现,加入发送弹幕消息的操作界面。
首先修改activity_main.xml中的代码,如下所示:
&code class=&language-xml hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&RelativeLayout
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&xmlns:android&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&/apk/res/android&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/activity_main&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:background&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&#000&&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&LinearLayout
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/operation_layout&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&50dp&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_alignParentBottom&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&true&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:background&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&#fff&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:visibility&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&gone&&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&EditText
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/edit_text&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&0dp&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_weight&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&1&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&Button
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:id&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&@+id/send&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_width&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&wrap_content&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:layout_height&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&match_parent&&/span&
&span class=&hljs-attribute& style=&box-sizing: border- color: rgb(102, 0, 102);&&android:text&/span&=&span class=&hljs-value& style=&box-sizing: border- color: rgb(0, 136, 0);&&&Send&&/span& /&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&LinearLayout&/span&&&/span&
&span class=&hljs-tag& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/&span class=&hljs-title& style=&box-sizing: border- color: rgb(0, 0, 136);&&RelativeLayout&/span&&&/span&&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&li style=&box-sizing: border- padding: 0px 5&&29&/li&&li style=&box-sizing: border- padding: 0px 5&&30&/li&&li style=&box-sizing: border- padding: 0px 5&&31&/li&&li style=&box-sizing: border- padding: 0px 5&&32&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&b}

我要回帖

更多关于 李白攻速铭文伤害不足 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信