DanmuControl.java 7.2 KB
package com.cnlive.goldenline.danmu;

import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;

import com.cnlive.goldenline.model.DamakuViewinfo;

import java.util.HashMap;
import java.util.List;

import master.flame.danmaku.controller.DrawHandler;
import master.flame.danmaku.controller.IDanmakuView;
import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.DanmakuTimer;
import master.flame.danmaku.danmaku.model.IDisplayer;
import master.flame.danmaku.danmaku.model.android.DanmakuContext;
import master.flame.danmaku.danmaku.model.android.Danmakus;
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;

/**
 * @Author Mr.hou
 * @time 2017/3/16
 * @Desc弹幕属性设置,字体颜色,显示位置
 */

public class DanmuControl {
    private BaseDanmaku danmaku;
    private static final String TAG = "DanmuControl";
    //弹幕显示的时间(如果是list的话,会 * i),记得加上mDanmakuView.getCurrentTime()
    private static final long ADD_DANMU_TIME = 2000;
    //这两个用来控制两行弹幕之间的间距
    private int DANMU_PADDING = 8;

    private Context mContext;
    private IDanmakuView mDanmakuView;
    private DanmakuContext mDanmakuContext;

    public DanmuControl(Context context) {
        this.mContext = context;
        initDanmuConfig();
    }

    /**
     * 初始化配置
     */
    private void initDanmuConfig() {
        // 设置最大显示行数
        HashMap<Integer, Integer> maxLinesPair = new HashMap<Integer, Integer>();
        maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 5); // 滚动弹幕最大显示2行
        // 设置是否禁止重叠
        HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<Integer, Boolean>();
        overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true);
        overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true);
        overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_BOTTOM, true);
        mDanmakuContext = DanmakuContext.create();
        mDanmakuContext
                .setDanmakuStyle(IDisplayer.DANMAKU_STYLE_NONE)
                .setDuplicateMergingEnabled(false)
                .setScrollSpeedFactor(1.2f)//越大速度越慢
                .setScaleTextSize(1.2f)
                .setMaximumLines(maxLinesPair)
                .preventOverlapping(overlappingEnablePair);
    }

    public void setDanmakuView(IDanmakuView danmakuView) {
        this.mDanmakuView = danmakuView;
        initDanmuView();
    }

    private void initDanmuView() {
        if (mDanmakuView != null) {
            mDanmakuView.setCallback(new DrawHandler.Callback() {
                @Override
                public void prepared() {
                    mDanmakuView.start();
                }

                @Override
                public void updateTimer(DanmakuTimer timer) {
                }

                @Override
                public void danmakuShown(BaseDanmaku danmaku) {
                }

                @Override
                public void drawingFinished() {
                }
            });
        }

        mDanmakuView.prepare(new BaseDanmakuParser() {

            @Override
            protected Danmakus parse() {
                return new Danmakus();
            }
        }, mDanmakuContext);
        mDanmakuView.enableDanmakuDrawingCache(true);
    }

    public void pause() {
        if (mDanmakuView != null && mDanmakuView.isPrepared()) {
            mDanmakuView.pause();//暂停时缓存,resume时显示
        }
    }

    public void hide() {
        if (mDanmakuView != null) {
            mDanmakuView.hide();//隐藏
        }
    }

    public void show() {
        if (mDanmakuView != null) {
            mDanmakuView.show();//显示
        }
    }

    public void resume() {
        if (mDanmakuView != null && mDanmakuView.isPrepared() && mDanmakuView.isPaused()) {
            mDanmakuView.resume();//暂停后恢复
        }
    }

    public void destroy() {
        if (mDanmakuView != null) {
            mDanmakuView.release();//释放
            mDanmakuView = null;
        }
    }

    /**
     * 添加弹幕到集合
     */
    public void addDanmuList(final List<DamakuViewinfo> danmuLists) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < danmuLists.size(); i++) {
                    addDanmu(danmuLists.get(i), i);
                }
            }
        }).start();
    }

    /**
     * 添加弹幕
     */
    public void addDanmu(DamakuViewinfo danmu, int i) {
        if (danmu.getVerticalPos() == 1) {
            //顶部显示
            danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_FIX_TOP);
        } else if (danmu.getVerticalPos() == 2) {
            //随机显示
            danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
        } else if (danmu.getVerticalPos() == 3) {
            //底部显示
            danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_FIX_BOTTOM);
        } else if (danmu.getVerticalPos()==0){
            //随机
            danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
        }
        SpannableStringBuilder spannable;
        spannable = createSpannable(danmu.text);
        danmaku.text = spannable;
        danmaku.padding = DANMU_PADDING;
        danmaku.priority = 0;  // 1:一定会显示, 一般用于本机发送的弹幕,但会导致行数的限制失效
        danmaku.isLive = false;
        danmaku.time = mDanmakuView.getCurrentTime() + (i * ADD_DANMU_TIME);
        danmaku.textSize=38;
        //设置字体颜色
        if (danmu.getTextColor() == 1) {
            danmaku.textColor = Color.parseColor("#ffffff");
        } else if (danmu.getTextColor() == 2) {
            danmaku.textColor = Color.parseColor("#ff6633");
        } else if (danmu.getTextColor() == 3) {
            danmaku.textColor = Color.parseColor("#ff9901");
        } else if (danmu.getTextColor() == 4) {
            danmaku.textColor = Color.parseColor("#ffff00");
        } else if (danmu.getTextColor() == 5) {
            danmaku.textColor = Color.parseColor("#00ff10");
        } else if (danmu.getTextColor() == 6) {
            danmaku.textColor = Color.parseColor("#00ffff");
        } else if (danmu.getTextColor() == 7) {
            danmaku.textColor = Color.parseColor("#008cee");
        } else if (danmu.getTextColor() == 8) {
            danmaku.textColor = Color.parseColor("#8600ff");
        } else if (danmu.getTextColor()==0){
            danmaku.textColor = Color.parseColor("#e5e5e5");
        }
        mDanmakuView.addDanmaku(danmaku);
    }

    private SpannableStringBuilder createSpannable(String content) {
        String text = "";
        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
        spannableStringBuilder.setSpan("", 0, text.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        if (!TextUtils.isEmpty(content)) {
            spannableStringBuilder.append(" ");
            spannableStringBuilder.append(content.trim());
        }
        return spannableStringBuilder;
    }
}