简单弹幕.

 <master.flame.danmaku.ui.widget.DanmakuView
        android:id="@+id/danmuu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></master.flame.danmaku.ui.widget.DanmakuView>
package com.example.day09_danmu;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.BackgroundColorSpan;
import android.text.style.ImageSpan;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import java.io.InputStream;

import master.flame.danmaku.controller.DrawHandler;
import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.DanmakuTimer;
import master.flame.danmaku.danmaku.model.android.DanmakuContext;
import master.flame.danmaku.danmaku.model.android.Danmakus;
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
import master.flame.danmaku.ui.widget.DanmakuView;

public class Main4Activity extends AppCompatActivity {
    private DanmakuView danmuu;

    private DanmakuContext danmakuContext;
    private BaseDanmakuParser baseDanmakuParser;
    private HeatrView home;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        danmuu = (DanmakuView) findViewById(R.id.danmuu);
        danmakuContext = DanmakuContext.create();
        baseDanmakuParser = createParser(null);
        danmuu.prepare(baseDanmakuParser, danmakuContext);
        danmuu.setCallback(new DrawHandler.Callback() {
            @Override
            public void prepared() {
                danmuu.start();
            }

            @Override
            public void updateTimer(DanmakuTimer timer) {

            }

            @Override
            public void danmakuShown(BaseDanmaku danmaku) {

            }

            @Override
            public void drawingFinished() {

            }
        });
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
        getSupportActionBar().hide();
        initView();
        home.getview();
    }

    public void dm(View view) {
        //danmu();

    }

    private SpannableStringBuilder createSpannable(Drawable drawable) {
        String text = "bitmap";
        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
        ImageSpan span = new ImageSpan(drawable);//ImageSpan.ALIGN_BOTTOM);
        spannableStringBuilder.setSpan(span, 0, text.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        spannableStringBuilder.append("图文混排");
        spannableStringBuilder.setSpan(new BackgroundColorSpan(Color.parseColor("#8A2233B1")), 0, spannableStringBuilder.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        return spannableStringBuilder;
    }

    private void danmu() {
        BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
        if (danmaku == null || danmuu == null) {
            return;
        }
        // for(int i=0;i<100;i++){
        // }
        danmaku.text = "这是一条弹幕" + System.nanoTime();
        danmaku.padding = 5;
        danmaku.priority = 0;  // 可能会被各种过滤器过滤并隐藏显示
        danmaku.isLive = true;
        danmaku.setTime(danmuu.getCurrentTime() + 1200);
        danmaku.textSize = 25f * (baseDanmakuParser.getDisplayer().getDensity() - 0.6f);
        danmaku.textColor = Color.RED;
        danmaku.textShadowColor = Color.WHITE;
        // danmaku.underlineColor = Color.GREEN;
        danmaku.borderColor = Color.GREEN;
        danmuu.addDanmaku(danmaku);
    }

    private BaseDanmakuParser createParser(InputStream stream) {

        if (stream == null) {
            return new BaseDanmakuParser() {

                @Override
                protected Danmakus parse() {
                    return new Danmakus();
                }
            };
        }
        return null;

    }

    private void initView() {
        home = (HeatrView) findViewById(R.id.home);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Canvas上实现弹幕效果,可以按照以下步骤进行操作: 1. 创建一个Canvas元素,并使用绝对定位将其覆盖在视频上方。可以使用HTML中的<canvas>标签,通过设置宽度和高度来确定Canvas的大小。 2. 在JavaScript中创建一个Barrage类,该类用于存储弹幕对象并记录相应的弹幕信息。可以使用一个数组来存储弹幕对象。 3. 在Barrage类中,绘制弹幕文本。你可以使用Canvas的绘制文本方法(如fillText)来将弹幕文本绘制在Canvas上。可以设置文本偏移量来控制弹幕的移动速度。 4. 在定时器中,更新弹幕的位置并重新绘制Canvas上的所有弹幕内容。你可以使用一个循环来遍历弹幕数组,更新每个弹幕的X坐标。然后使用Canvas的绘制文本方法将更新后的弹幕绘制在Canvas上。 5. 当弹幕文本超出Canvas范围时,从弹幕数组中移除该弹幕。 下面是一个简单的实现示例: ```javascript let canvas = document.getElementById('canvas'); let ctx = canvas.getContext('2d'); ctx.font = '24px Verdana'; class Barrage { constructor(text, x, y, speed, color) { this.text = text; this.x = x; this.y = y; this.speed = speed; this.color = color; } } let barrageList = [ new Barrage('弹幕1', 2000, 24, 1, 'red'), new Barrage('弹幕2', 1900, 48, 3, 'pink'), // 其他弹幕... ]; function updateBarrage() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (let i = 0; i < barrageList.length; i++) { let barrage = barrageList[i]; barrage.x -= barrage.speed; ctx.fillStyle = barrage.color; ctx.fillText(barrage.text, barrage.x, barrage.y); if (barrage.x < -300) { barrage.x = 2000; } } } setInterval(updateBarrage, 1000 / 60); ``` 在HTML中,你可以放置一个`<div>`元素并在其中嵌入上述Canvas元素: ```html <div> <canvas id="canvas" width="2000" height="240"></canvas> </div> ``` 这样,你就可以在Canvas上实现弹幕效果了。这个示例中的弹幕将从右侧向左侧移动,并循环播放。你可以根据需要进行调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用canvas如何实现发送视频弹幕,H5 Canvas学习](https://blog.csdn.net/wzsud/article/details/122270259)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Canvas弹幕实现](https://blog.csdn.net/z69183787/article/details/105391669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [canvas画布的方式实现弹幕](https://blog.csdn.net/wuyoulv/article/details/128639020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值