服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android简单实现弹幕效果

Android简单实现弹幕效果

2022-11-09 15:33Android涛 Android

这篇文章主要为大家详细介绍了Android简单实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现弹幕效果的具体代码,供大家参考,具体内容如下

首先分析一下,他是由三层布局来共同完成的,第一层视频布局,第二层字幕布局,第三层输入框布局,要想让这三个布局在同一页面上,必须用相对布局或帧布局。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?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>

创建一个弹幕的解析器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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);
    }
  }

最后使页面横屏展示:

?
1
2
3
4
5
6
7
8
9
10
<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

延伸 · 阅读

精彩推荐
  • Androidandroid中Handle类的用法实例分析

    android中Handle类的用法实例分析

    这篇文章主要介绍了android中Handle类的用法,以实例形式较为详细的分析了基于Handle类线程执行的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless4082021-04-01
  • AndroidAndroid实现循环平移动画示例

    Android实现循环平移动画示例

    这篇文章主要介绍了Android实现循环平移动画示例,本文讲解实现用一张背景图做循环从左往右平移动画,需要的朋友可以参考下...

    Android开发网5622021-03-26
  • AndroidAndroid LineChart绘制多条曲线的方法

    Android LineChart绘制多条曲线的方法

    这篇文章主要为大家详细介绍了Android LineChart绘制多条曲线的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Vivinia_Vivinia11462022-10-18
  • AndroidAndroid AES加密工具类分享

    Android AES加密工具类分享

    这篇文章主要介绍了Android AES加密工具类分享,本文给出了实现代码和使用例子,本文使用PKCS5Padding加密方式实现,需要的朋友可以参考下...

    Android开发网5072021-03-10
  • Androidandroid之camera用法实例详解

    android之camera用法实例详解

    这篇文章主要介绍了android之camera用法,以实例形式较为详细的分析了Android使用camera拍照的相关技巧与注意事项,需要的朋友可以参考下...

    Ruthless5752021-03-31
  • AndroidAndroid手机获取IP地址的两种方法

    Android手机获取IP地址的两种方法

    这篇文章主要介绍了Android手机获取IP地址的两种方法,本文分别讲解了WIFI和GPRS两种情况下各自获取手机IP地址的方法,需要的朋友可以参考下...

    Android开发网11442021-03-22
  • AndroidAndroid中获取手机屏幕大小的方法

    Android中获取手机屏幕大小的方法

    这篇文章主要介绍了Android中获取手机屏幕大小的方法,Android开发需要获得屏幕的宽高,本文为大家解析 Android中如何获取手机屏幕大小,需要的朋友可以参...

    cjjky4522021-04-24
  • Androidandroid开发 eclipse alt+”/”自动提示失效的解决方法

    android开发 eclipse alt+”/”自动提示失效的解决方法

    最近在学习android开发布局这块。第一次学习,很多代码不熟悉。所以自动提示对我来说很重要。但悲催的就是这个自动提示失效。今天在网上搜索了一下解...

    Android开发网8142021-03-02