基于IJKDanmakuFlameMaster的android 弹幕接入
来源:互联网 发布:淘宝网加绒运动服装 编辑:程序博客网 时间:2024/05/22 01:43
首先import 弹幕包
import master.flame.danmaku.danmaku.util.SystemClock;import master.flame.danmaku.controller.IDanmakuView;import master.flame.danmaku.danmaku.loader.ILoader;import master.flame.danmaku.danmaku.loader.IllegalDataException;import master.flame.danmaku.danmaku.loader.android.DanmakuLoaderFactory;import master.flame.danmaku.danmaku.model.BaseDanmaku;import master.flame.danmaku.danmaku.model.DanmakuTimer;import master.flame.danmaku.danmaku.model.IDanmakus;import master.flame.danmaku.danmaku.model.IDisplayer;import master.flame.danmaku.danmaku.model.android.BaseCacheStuffer;import master.flame.danmaku.danmaku.model.android.DanmakuContext;import master.flame.danmaku.danmaku.model.android.Danmakus;import master.flame.danmaku.danmaku.model.android.SpannedCacheStuffer;import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;import master.flame.danmaku.danmaku.parser.IDataSource;import master.flame.danmaku.danmaku.parser.android.BiliDanmukuParser;import master.flame.danmaku.danmaku.util.IOUtils;
定义全局变量
private IDanmakuView mDanmakuView; private BaseDanmakuParser mParser; private DanmakuContext mContext;
启动单个线程加载远程图片
private BaseCacheStuffer.Proxy mCacheStufferAdapter = new BaseCacheStuffer.Proxy() { private Drawable mDrawable; @Override public void prepareDrawing(final BaseDanmaku danmaku, boolean fromWorkerThread) { if (danmaku.text instanceof Spanned) { // 根据你的条件检查是否需要需要更新弹幕 // FIXME 这里只是简单启个线程来加载远程url图片,请使用你自己的异步线程池,最好加上你的缓存池 new Thread() { @Override public void run() { String url = "http://vod.vbyte.cn/leifeng32.ico"; InputStream inputStream = null; Drawable drawable = mDrawable; if(drawable == null) { try { URLConnection urlConnection = new URL(url).openConnection(); inputStream = urlConnection.getInputStream(); drawable = BitmapDrawable.createFromStream(inputStream, "bitmap"); mDrawable = drawable; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(inputStream); } } if (drawable != null) { drawable.setBounds(0, 0, 100, 100); SpannableStringBuilder spannable = createSpannable(drawable); danmaku.text = spannable; if(mDanmakuView != null) { mDanmakuView.invalidateDanmaku(danmaku, false); } return; } } }.start(); } } @Override public void releaseResource(BaseDanmaku danmaku) { // TODO 重要:清理含有ImageSpan的text中的一些占用内存的资源 例如drawable } };
设置最大显示行数及是否进制重叠
HashMap<Integer, Integer> maxLinesPair = new HashMap<Integer, Integer>();// 滚动弹幕最大显示5行maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 5); HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<Integer, Boolean>();overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true);overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true);
接下来初始化上面定义的最关键三个全局变量
mDanmakuView = (IDanmakuView) findViewById(R.id.sv_danmaku);mContext = DanmakuContext.create();mContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN,3) .setDuplicateMergingEnabled(false) .setScaleTextSize(1.2f) // 图文混排使用SpannedCacheStuffer .setCacheStuffer(new SpannedCacheStuffer(), mCacheStufferAdapter) .setMaximumLines(maxLinesPair) .preventOverlapping(overlappingEnablePair); if (mDanmakuView != null) { //很明显,这就是我们弹幕的显示资源 mParser = createParser(this.getResources().openRawResource(R.raw.comments)); mDanmakuView.setCallback(new master.flame.danmaku.controller.DrawHandler.Callback() { @Override public void updateTimer(DanmakuTimer timer) { } @Override public void drawingFinished() { } @Override public void danmakuShown(BaseDanmaku danmaku) { } @Override public void prepared() { mDanmakuView.start(); } }); mDanmakuView.setOnDanmakuClickListener(new IDanmakuView.OnDanmakuClickListener() { @Override public void onDanmakuClick(BaseDanmaku latest) { } @Override public void onDanmakuClick(IDanmakus danmakus) { } }); mDanmakuView.prepare(mParser, mContext); mDanmakuView.showFPS(true); mDanmakuView.enableDanmakuDrawingCache(true); ((View) mDanmakuView).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mMediaController.setVisibility(View.VISIBLE); } }); }
下面是跟随播放器的一些弹幕库的暂定、播放、释放资源的操作
@Override protected void onPause() { super.onPause(); if (mDanmakuView != null && mDanmakuView.isPrepared()) { mDanmakuView.pause(); } } @Override protected void onResume() { super.onResume(); if (mDanmakuView != null && mDanmakuView.isPrepared() && mDanmakuView.isPaused()) { mDanmakuView.resume(); } } @Override protected void onDestroy() { super.onDestroy(); if (mDanmakuView != null) { // dont forget release! mDanmakuView.release(); mDanmakuView = null; } } @Override public void onBackPressed() { super.onBackPressed(); if (mDanmakuView != null) { // dont forget release! mDanmakuView.release(); mDanmakuView = null; } }
弹幕的一些属性操作,可用户自设置,易理解,不解释
mDanmakuView.hide();mDanmakuView.show();mDanmakuView.pause();mDanmakuView.resume();
来一条纯文本弹幕测试一下
private void addDanmaku(boolean islive) { BaseDanmaku danmaku = mContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL); if (danmaku == null || mDanmakuView == null) { return; } danmaku.text = "这就是一条测试,至于你信不信,反正我是信了"; danmaku.padding = 5; // 优先级,>0为高优先级不会被过滤器过滤,会被各种过滤器过滤并隐藏显示 danmaku.priority = 0; danmaku.isLive = islive; danmaku.time = mDanmakuView.getCurrentTime() + 1200; danmaku.textSize = 25f * (mParser.getDisplayer().getDensity() - 0.6f); danmaku.textColor = Color.RED; danmaku.textShadowColor = Color.WHITE; danmaku.underlineColor = Color.GREEN; danmaku.borderColor = Color.GREEN; mDanmakuView.addDanmaku(danmaku); }
来一条图文混编的测试一下,SpannableStringBuilder
private void addDanmaKuShowTextAndImage(boolean islive) {
BaseDanmaku danmaku = mContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL); Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher); drawable.setBounds(0, 0, 100, 100); 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); //以上部分是与纯文本的区别,显示资源的区别 danmaku.text = spannable; danmaku.padding = 5; danmaku.priority = 1; // 一定会显示, 一般用于本机发送的弹幕 danmaku.isLive = islive; danmaku.time = mDanmakuView.getCurrentTime() + 1200; danmaku.textSize = 25f * (mParser.getDisplayer().getDensity() - 0.6f); danmaku.textColor = Color.RED; danmaku.textShadowColor = 0; // 重要:如果有图文混排,最好不要设置描边(设textShadowColor=0),否则会进行两次复杂的绘制导致运行效率降低 danmaku.underlineColor = Color.GREEN; mDanmakuView.addDanmaku(danmaku);}
1 0
- 基于IJKDanmakuFlameMaster的android 弹幕接入
- Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕
- Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕
- 基于JQuery的弹幕APP
- Android的简易弹幕
- Android弹幕的实现
- 基于Android淡入淡出弹幕实现
- android仿乐视网弹幕的实现
- Android 弹幕的实现DanmakuFlameMaster
- 基于websocket技术的网页弹幕实现
- 基于Android系统的IPv6网络接入分析
- android弹幕
- Android弹幕实现:基于B站弹幕开源系统(4)-重构
- Android弹幕实现:基于B站弹幕开源系统(5)-抽象和复用
- Android下的弹幕的简单实现
- Android安卓最简单的弹幕实现
- Android 弹幕的实现其实很简单
- 基于C#弹幕类射击游戏的实现——(七)弹幕类实现
- HYSBZ 3672购票
- C++实验7—特殊三位数
- UVA oj 489 Hangman Judge(字符串)
- 简单的分布式图片存储及搜索访问服务
- 面向对象程序设计-继承与多态
- 基于IJKDanmakuFlameMaster的android 弹幕接入
- iOS百度地图简单应用( iOS地图定位(定位、地理编码与反地理编码、mapView、大头针)
- 【Android新手笔记六】从服务器获取列表
- Android BuildConfig.DEBUG的使用详解
- vagrant create a base box
- Mysql的基本优化
- Linux学习要点
- CnSkype信息互联办公对企业的影响有多大
- moveTaskToback退后台的用法及作用