欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android简单实现弹幕效果

程序员文章站 2022-05-21 21:17:36
本文实例为大家分享了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>

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