Android simply realizes barrage effect

  • 2021-11-14 06:57:50
  • OfStack

In this paper, we share the specific code of Android to achieve barrage effect for your reference. The specific contents are as follows

First of all, under the analysis of 1, it is completed by three layers of layout, namely, the first layer of video layout, the second layer of subtitle layout and the third layer of input box layout. In order to make these three layouts on the same page, relative layout or frame layout must be used.


<?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 parser for 1 barrage


public class MainActivity extends AppCompatActivity {
 
  private boolean showDanmaku;
  private DanmakuView danmakuView;
  private DanmakuContext danmakuContext;
  // Create 1 Parser of barrage 
  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);
    // Play video 
    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);
    // Called enableDanmakuDrawingCache() Method to improve drawing efficiency, that is, drawing speed 
    //  Called again setCallback() Method to set the callback function. 
    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();
    // No. 1 1 Parser whose parameters are barrage 
    // Call DanmakuView Adj. prepare() Method to prepare, and when the preparation is completed, it will automatically call the callback function just set prepared() Method 
    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"
   Just add this 1 Line of code will do 
   android:screenOrientation="landscape"
   >
  <intent-filter>
     <action android:name="android.intent.action.MAIN" />
 
     <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
</activity>

Related articles: