Android 弹幕的实现DanmakuFlameMaster

 //手动隐藏标题栏
        if(getSupportActionBar() != null){
            getSupportActionBar().hide();
        }


1、添加弹幕依赖

compile'com.github.ctiao:DanmakuFlameMaster:0.7.3'
2、添加权限,这里我用了本地的视频,如果要获取网络上的视频,要添加联网权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3、在values文件夹下,创建dimens文件

<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>

4、在res下面创建raw文件夹,然后将视频放进去,到这步,一切准备就绪,下面开始正式上代码了
5、activity_main.xml 
RelativeLayout占全屏
<VideoView
    android:id="@+id/diveo_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_layout"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:background="#fff"
    android:visibility="gone"
    >

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="send"
        />
</LinearLayout>
6.在MainActivity里面的代码
private VideoView diveo_view;
private DanmakuView danmaku_view;
private LinearLayout operation_layout;
private EditText edit_text;
private Button send;

private boolean showDanmaku;
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);
    //手动隐藏标题
    if(getSupportActionBar() != null){
        getSupportActionBar().hide();
    }

    initView();//控件初始化

}

private void initView() {
    //控件
    diveo_view = findViewById(R.id.diveo_view);
    danmaku_view = findViewById(R.id.danmaku_view);
    operation_layout = findViewById(R.id.operation_layout);
    edit_text = findViewById(R.id.edit_text);
    send = findViewById(R.id.send);

    //视频的地址
    diveo_view.setVideoURI(Uri.parse("android.resource://" + getPackageName()
            + "/" + R.raw.mian));
    diveo_view.start();//视频开始

    //弹幕
    danmaku_view.enableDanmakuDrawingCache(true);
    danmaku_view.setCallback(new DrawHandler.Callback() {
        @Override
        public void prepared() {
            //准备阶段
            showDanmaku = true;
            danmaku_view.start();
            generateSomeDanmaku();
        }

        @Override
        public void updateTimer(DanmakuTimer timer) {

        }

        @Override
        public void danmakuShown(BaseDanmaku danmaku) {

        }

        @Override
        public void drawingFinished() {

        }
    });
    danmakuContext = DanmakuContext.create();
    danmaku_view.prepare(parser,danmakuContext);

    //点击屏幕,显示弹幕输入框
    //再次点击,隐藏输入框
    danmaku_view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(operation_layout.getVisibility() == View.GONE){
                operation_layout.setVisibility(View.VISIBLE);
            }else if(operation_layout.getVisibility() == View.VISIBLE){
                operation_layout.setVisibility(View.GONE);
            }
        }
    });

    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //发送消息
            addDanmaku(edit_text.getText().toString(),true);
        }
    });

}

/**
 * 随机生成一些内容测试
 */
private void generateSomeDanmaku() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (showDanmaku){
                int time = new Random().nextInt(300);
                String content = "我是---" + time;
                addDanmaku(content, false);
                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

//添加
private void addDanmaku(String content, boolean b) {
    BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
    danmaku.text = content;
    danmaku.padding = 5;
    danmaku.textSize = sp2px(20);
    danmaku.textColor = Color.WHITE;
    danmaku.setTime(danmaku_view.getCurrentTime());
    if (b) {
        danmaku.borderColor = Color.GREEN;
    }
    danmaku_view.addDanmaku(danmaku);
}


//文字的大小
private float sp2px(int value) {
    final float fontScale = getResources().getDisplayMetrics().scaledDensity;
    return (int) (value * fontScale + 0.5f);
}

//如果不加这个方法,弹幕可能会从中间显示
@Override
protected void onPause() {
    super.onPause();
    if (danmaku_view != null && danmaku_view.isPrepared()) {
        danmaku_view.pause();
    }
}

//如果不加这个方法,弹幕可能会从中间显示
@Override
protected void onResume() {
    super.onResume();
    if (danmaku_view != null && danmaku_view.isPrepared() && danmaku_view.isPaused()) {
        danmaku_view.resume();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //释放弹幕资源
    showDanmaku = false;
    if (danmaku_view != null) {
        danmaku_view.release();
        danmaku_view = null;
    }
}

//Activity一加载完毕,就触发
@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_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

=======end=========
到这里全部结束



猜你喜欢

转载自blog.csdn.net/color_0716/article/details/78806322
今日推荐