Android简单实现弹幕效果

时间:2022-07-27
本文章向大家介绍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 

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