前幾天作一個需求,社區文章若是是視頻類型,須要在文章列表播放視頻預覽動圖。java
這裏咱們使用了視頻部門的服務,生成視頻預覽,對方給出的可選格式爲 webp、mp四、flv、hls,後面三個都是視頻格式,確定不能做爲預覽圖,並且考慮到 webp 有用較小的體積,咱們使用的 fresco 也支持 WebP 的動圖,所以果斷選擇了 WebP 格式。git
fresco 加載動圖的方法github
val uri = Uri.parse("http://voddafz06jj.vod.126.net/voddafz06jj/videoPreview_1821338293_IQAB9DSR.webp")
val controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.build()
drawee_view.controller = controller
複製代碼
看起來好像沒什麼問題,但是等開發完成拿給產品看的時候,產品不樂意了,這個動圖怎麼只能播放一次呢,我須要循環播放。web
趕忙去補了下課,原來 WebP 動圖是能夠設置循環次數的,詢問了視頻部門的同事,原來是他們生成的預覽圖沒有設置循環播放屬性,坑爹。。bash
而視頻部門也須要排期來支持預覽圖循環屬性,只能這樣告訴產品了,產品果真仍是不滿意,「我無論,我就要無限循環播放!」ide
只能硬着頭皮搞了oop
果真找到了一個相似的問題ui
emm..不過這位仁兄遇到的問題是圖片的循環次數是1,但是使用 fresco 卻無限循環播放,並且這位仁兄使用的是 gif 動圖,這就尷尬了,不過這些都不重要,根本問題是一致的,就是要強行設置動圖的播放次數,繼續往下看,找到一條點贊數比較多的回答.net
趕忙試一下,納尼,怎麼仍是隻放一遍?
仔細看了一下,這位仁兄的版本是 0.10.0
,而咱們用的版本是 1.2.0
,看起來應該是 fresco 改了代碼
因而看了下源碼,果真不叫 mTotalLoops
,改成 mLoopCount
了
趕快修改代碼,再試一次,此次果真能夠了
上代碼
val uri = Uri.parse("http://voddafz06jj.vod.126.net/voddafz06jj/videoPreview_1821338293_IQAB9DSR.webp")
val controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.setControllerListener(object : BaseControllerListener<ImageInfo>() {
override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) {
try {
if (imageInfo is CloseableAnimatedImage) {
val animatedImage = imageInfo.image
if (animatedImage is WebPImage) {
if (animatable != null) {
val field = AbstractAnimatedDrawable::class.java.getDeclaredField("mLoopCount")
field.isAccessible = true
field.set(animatable, Integer.MAX_VALUE)
}
}
}
} catch (e: Throwable) {
e.printStackTrace()
}
}
})
.build()
drawee_view.controller = controller
複製代碼
這裏只針對 webp 圖片設置無限循環,以避免影響 gif 圖片。
咱們遇到了 fresco 加載 webp 動圖沒法控制播放次數的問題,在社區的幫助下,經過反射修改循環次數,因爲版本差別,查看源碼改動,並最終解決問題。
不過這僅僅是一個臨時方案,並且只針對特定版本有效,說不定 facebook 哪天不爽又改了代碼,咱們的方案就失效了。仍是要按照規範,生成支持循環播放的 webp 動圖。
其實今天這篇文章更想表達的是一種解決問題的思路,但願對你們有用。
遷移自個人簡書 2018.08.02