Android simple implementation of barrage effect

This example shares the specific code for Android to realize the barrage effect for your reference. The specific contents are as follows

First of all, it is completed by three layers of layout. The first layer of video layout, the second layer of caption layout and the third layer of input box layout. If you want these three layouts on the same page, you must use relative layout or frame layout.

<?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>

Create a barrage parser

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);
    }
  }

Finally, make the page display horizontally:

<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>

The above is the whole content of this article. I hope it will help you in your study, and I hope you will support us a lot.

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>