当前位置: 移动技术网 > 移动技术>移动开发>Android > Android简单实现弹幕效果

Android简单实现弹幕效果

2020年03月09日  | 移动技术网移动技术  | 我要评论

本文实例为大家分享了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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网