bilibili / DanmakuFlameMaster

Android开源弹幕引擎·烈焰弹幕使 ~
http://app.bilibili.com/
Apache License 2.0
9.53k stars 2.1k forks source link

自定义数据解析器,不显示弹幕,急求,谢谢 #454

Open morefreeliang opened 4 years ago

morefreeliang commented 4 years ago
private fun createParser(
        context: Context,
        stream: InputStream?
    ): BaseDanmakuParser? {
        val parser: BaseDanmakuParser = object : BaseDanmakuParser() {
            override fun parse(): Danmakus {
                return Danmakus()
            }
        }
        if (stream == null) return parser
        val loader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_ACFUN)
        val funParser = AcFunDanmuParser(context)
        try {
            loader.load(stream)
            funParser.load(loader.dataSource)
            return funParser
        } catch (e: IllegalDataException) {
            e.printStackTrace()
        }
        return parser
    }
class AcFunDanmuParser(val context: Context) : BaseDanmakuParser() {

    override fun parse(): IDanmakus {
        return if (this.mDataSource != null && this.mDataSource is JSONSource) {
            val jsonSource = this.mDataSource as JSONSource
            doParse(jsonSource.data())
        } else {
            Danmakus()
        }
    }

    private fun doParse(data: JSONArray?): Danmakus {
        var danmakus = Danmakus()
        return if (data != null && data.length() != 0) {
            for (i in 0 until data.length()) {
                try {
                    val jsonObj = data.getJSONObject(i)
                    if (jsonObj != null) {
                        danmakus = realParse(i, jsonObj, danmakus)
                    }
                } catch (e: JSONException) {
                    e.printStackTrace()
                }
            }
            danmakus
        } else {
            danmakus
        }
    }

    private fun realParse(index: Int, obj: JSONObject, danmakus: Danmakus): Danmakus {
        if (obj.length() != 0) {
            try {
                //{"content":"真好看","picUrl":"http://...png"}
                val content = obj.optString("content")
                val picUrl = obj.optString("picUrl")
                val item = this.mContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL,this.mContext)

                GlideUtil.convertUrl2Bitmap(context, picUrl, object : GlideUtil.Url2BitmapCallback {
                    override fun url2BitmapSuccess(bitmap: Bitmap?) {
                        val dataMap = HashMap<String, Any?>()
                        dataMap["content"] = content
                        dataMap["bitmap"] = BitmapUtil.getDanmuBitmap(bitmap)
                        dataMap["color"] = "#80000000"

                        item.tag = dataMap
                        item.padding = 5
                        item.priority = 0
                        item.isLive = false
                        item.time = System.currentTimeMillis() + index * 1000
                        item.textSize = 0f
                        // 重要:如果有图文混排,最好不要设置描边(设textShadowColor=0),否则会进行两次复杂的绘制导致运行效率降低
                        item.textShadowColor = 0
                        danmakus.addItem(item)
                        //Logger.e("parser=${content}--${picUrl}")
                    }

                    override fun url2BitmapFailed(e: GlideException?) {
                    }
                })
            } catch (e: Exception) {
                Logger.e("error=${e.message}")
                e.printStackTrace()
            }
            return danmakus
        } else {
            return danmakus
        }
    }
}

打log发现,解析过程都是走的,但是就不显示弹幕?why?

sunyiyan commented 3 years ago

是否切换了线程上下文

dylanZk1 commented 1 year ago

又或者弹幕渲染器不支持你这种解析后的结果?