Coder Social home page Coder Social logo

danmukulight's Introduction

DanmukuLight

Android上专为视频直播打造的轻量级弹幕库(100多kb)

demo运行后的效果如下:

下载示例Apk

目前支持以下需求

  • 继承自View实现的DanMuView(直播间的弹幕,推荐使用这种)
  • 继承自SurfaceView实现的DanMuView
  • 支持显示富文本内容
  • 支持弹幕单击事件的处理

使用:

在Module中的build.gradle文件里,添加以下依赖:

allprojects {
    repositories {
        jcenter()
        mavenCentral() // 切记要添加这个

        maven {
            url 'https://dl.bintray.com/hpdx/maven/'
        }
    }
}

compile 'com.anbetter:danmukulight:1.0.1'

在xml中添加

        <com.anbetter.danmuku.DanMuView
            android:id="@+id/danmaku_container_broadcast"
            android:layout_width="match_parent"
            android:layout_height="80dp"/>

注:每条弹道的高度目前为40dp

启动弹幕引擎

        mDanMuContainerBroadcast = (DanMuView) findViewById(R.id.danmaku_container_broadcast);
        mDanMuContainerBroadcast.prepare();

创建弹幕对象

        DanMuModel danMuView = new DanMuModel();
        danMuView.setDisplayType(DanMuModel.RIGHT_TO_LEFT);
        danMuView.setPriority(DanMuModel.NORMAL);
        danMuView.marginLeft = DimensionUtil.dpToPx(mContext, 30);

        // 显示的文本内容
        danMuView.textSize = DimensionUtil.spToPx(mContext, 14);
        danMuView.textColor = ContextCompat.getColor(mContext, R.color.light_green);
        danMuView.textMarginLeft = DimensionUtil.dpToPx(mContext, 5);

        if (entity.getRichText() != null) {
            danMuView.text = RichTextParse.parse(mContext, entity.getRichText(), DimensionUtil.spToPx(mContext, 18), false);
        } else {
            danMuView.text = entity.getText();
        }

        // 弹幕文本背景
        danMuView.textBackground = ContextCompat.getDrawable(mContext, R.drawable.corners_danmu);
        danMuView.textBackgroundMarginLeft = DimensionUtil.dpToPx(mContext, 15);
        danMuView.textBackgroundPaddingTop = DimensionUtil.dpToPx(mContext, 3);
        danMuView.textBackgroundPaddingBottom = DimensionUtil.dpToPx(mContext, 3);
        danMuView.textBackgroundPaddingRight = DimensionUtil.dpToPx(mContext, 15);

将弹幕添加到弹道上

mDanMuContainerBroadcast.add(danMuView);

OK了,就这么简单,一条弹幕就发送成功了

隐藏或者显示弹幕

mDanMuContainerBroadcast.hideAllDanMuView(hide); // boolean

对了,若要弹幕是能响应单击事件,需要添加如下处理:

在xml中添加DanMuParentView

 <com.anbetter.danmuku.DanMuParentView
        android:id="@+id/dpv_broadcast"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp">

        <com.anbetter.danmuku.DanMuView
            android:id="@+id/danmaku_container_broadcast"
            android:layout_width="match_parent"
            android:layout_height="80dp"/>

    </com.anbetter.danmuku.DanMuParentView>

在构建弹幕对象的代码中添加

        danMuView.enableTouch(true);
        danMuView.setOnTouchCallBackListener(new OnDanMuTouchCallBackListener() {
             @Override
             public void callBack(DanMuModel danMuView) {

             }
        });

在使用过程中有遇到bug,欢迎提issuse ! 若你觉得还不错,请点Star, 谢谢!

danmukulight's People

Contributors

hpdx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

danmukulight's Issues

如何修改弹道的间距

你好作者,感谢提供这个库,我想问下修改弹道的思路,大概在哪里可以进行修改

Quiz

Lz,这个库支持加入在线头像显示吗

弹幕切换横屏后 弹出位置异常

切换横屏后应该重新测量位置对吗?希望可以改一下,很多弹幕都是在视频上面,视屏都有横屏全屏播放的,其他功能都挺好的

用的DanMuSurfaceView 设置透明之后的问题

mDanMuContainerBroadcast.setZOrderOnTop(true);
mDanMuContainerBroadcast.getHolder().setFormat(PixelFormat.TRANSLUCENT); 这样设置之后DanMuSurfaceView透明了 但是DanMuSurfaceView外面套了一层ScrollView 上下滑动的时候DanMuSurfaceView会穿透所有控件 覆盖在别的布局之上 这个问题怎么解决?还是我设置透明的方式不对?

引用报错

按照项目页面的使用提示,Android Studio 3.5.2 提示 Could not resolve。大佬是不是要更新下使用说明了

bug

设置弹幕的速度无效。。

大佬还维护吗?

难得一个可以跟哔哩哔哩的弹幕不相上下的开源弹幕。setSpeed设置后感觉速度没啥变化。目前还是要下载源代码自己改下。

怎么把弹幕放在任意位置?

大神,我用DanMuParentView作为DanMuView的根布局,DanMuView的高度为80dp,为什么弹幕有大部分都会隐藏呢?(DanMuView的高度不设置全屏,很多弹幕都不会出现在DanMuView 80dp高度的弹道里面),如何解决呢?在线等

作者您好,我想把高度改高,应该怎么操作?

我在DanMuProducedPool和DanMuConsumedPool两个文件,分别把DEFAULT_SINGLE_CHANNEL_HEIGHT=40改成了80,而且在使用DanMuView的时候,高度我改成160了,但是高度没有变化,和40时候一样,应该怎么操作,看见还麻烦回复我一下,谢谢!

事件问题

场景:弹幕一般是在最顶层,某些界面 有刷新、NestedScrollView 、View点击事件等等、在弹幕下面的 这时候 手指触摸在弹幕上面 应该也把事件 交给其他view或者容器消费事件 而不是 都给弹幕来消费

弹幕点击事件相关

我看了看 , 如果DanmuView 在一个FrameLayout的顶层的话 , 设置点击事件会拦截下层的事件 , 导致下层的View 无法接收事件 , 而且DanMuParentView 似乎是不必要的 ?

我在DanMuView 中 做了如下改动

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d(TAG, "onTouchEvent");
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "ACTION_DOWN");
                for (int i = 0; i < onDanMuViewTouchListeners.size(); i++) {
                    DanMuModel listener = (DanMuModel) onDanMuViewTouchListeners.get(i);
                    boolean onTouched = listener.onTouch(event.getX(), event.getY());
                    if ((listener).getOnTouchCallBackListener() != null && onTouched) {
                        Log.d(TAG, "return true;");
                        mCurrentDanmaKuOnDanMuViewTouchListener = listener;
                        return true;
                    }
                }
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_POINTER_UP:
                break;
            case MotionEvent.ACTION_MOVE:

                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "ACTION_UP");
                if (mCurrentDanmaKuOnDanMuViewTouchListener != null) {
                    (mCurrentDanmaKuOnDanMuViewTouchListener).getOnTouchCallBackListener().callBack(mCurrentDanmaKuOnDanMuViewTouchListener);
                }
                if (!hasCanTouchDanMus()) {
                    if (onDanMuParentViewTouchCallBackListener != null) {
                        onDanMuParentViewTouchCallBackListener.callBack();
                    }
                } else {
                    if (onDanMuParentViewTouchCallBackListener != null) {
                        onDanMuParentViewTouchCallBackListener.hideControlPanel();
                    }
                }
                return true;
        }
        Log.d(TAG, "return false;");
        return false;
    }

布局中并未使用 DanMuParentView

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.