Android简单实现弹幕效果
程序员文章站
2024-01-30 10:26:58
本文实例为大家分享了android实现弹幕效果的具体代码,供大家参考,具体内容如下
首先分析一下,他是由三层布局来共同完成的,第一层视频布局,第二层字幕布局,第三层输入框布局,要想让...
本文实例为大家分享了android实现弹幕效果的具体代码,供大家参考,具体内容如下
首先分析一下,他是由三层布局来共同完成的,第一层视频布局,第二层字幕布局,第三层输入框布局,要想让这三个布局在同一页面上,必须用相对布局或帧布局。
<?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>
创建一个弹幕的解析器
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); } }
最后使页面横屏展示:
<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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。