package com.dl7.player.danmaku; import android.graphics.Color; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import master.flame.danmaku.danmaku.model.BaseDanmaku; import master.flame.danmaku.danmaku.model.android.Danmakus; import master.flame.danmaku.danmaku.parser.BaseDanmakuParser; import master.flame.danmaku.danmaku.parser.android.JSONSource; import master.flame.danmaku.danmaku.util.DanmakuUtils; /** * Created by long on 2016/12/22. * A站弹幕解析器 */ public class AcFunDanmakuParser extends BaseDanmakuParser { @Override public Danmakus parse() { if (mDataSource != null && mDataSource instanceof JSONSource) { JSONSource jsonSource = (JSONSource) mDataSource; return doParse(jsonSource.data()); } return new Danmakus(); } /** * @param danmakuListData 弹幕数据 * 传入的数组内包含普通弹幕,会员弹幕,锁定弹幕。 * @return 转换后的Danmakus */ private Danmakus doParse(JSONArray danmakuListData) { Danmakus danmakus = new Danmakus(); if (danmakuListData == null || danmakuListData.length() == 0) { return danmakus; } for (int i = 0; i < danmakuListData.length(); i++) { try { JSONObject danmakuArray = danmakuListData.getJSONObject(i); if (danmakuArray != null) { danmakus = _parse(danmakuArray, danmakus); } } catch (JSONException e) { e.printStackTrace(); } } return danmakus; } private Danmakus _parse(JSONObject jsonObject, Danmakus danmakus) { if (danmakus == null) { danmakus = new Danmakus(); } if (jsonObject == null || jsonObject.length() == 0) { return danmakus; } for (int i = 0; i < jsonObject.length(); i++) { try { JSONObject obj = jsonObject; String c = obj.getString("c"); String[] values = c.split(","); if (values.length > 0) { int type = Integer.parseInt(values[2]); // 弹幕类型 if (type == 7) continue; long time = (long) (Float.parseFloat(values[0]) * 1000); // 出现时间 int color = Integer.parseInt(values[1]) | 0xFF000000; // 颜色 float textSize = Float.parseFloat(values[3]); // 字体大小 BaseDanmaku item = mContext.mDanmakuFactory.createDanmaku(type, mContext); if (item != null) { item.setTime(time); item.textSize = textSize * (mDispDensity - 0.6f); item.textColor = color; item.textShadowColor = color <= Color.BLACK ? Color.WHITE : Color.BLACK; DanmakuUtils.fillText(item, obj.optString("m", "....")); item.index = i; item.setTimer(mTimer); danmakus.addItem(item); } } } catch (JSONException e) { } catch (NumberFormatException e) { } } return danmakus; } }