软件编程
位置:首页>> 软件编程>> Android编程>> Android简单实现弹幕效果

Android简单实现弹幕效果

作者:Android涛  发布时间:2022-08-12 01:24:08 

标签: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>

来源:https://blog.csdn.net/qq_40441190/article/details/78519203

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com