diff --git a/app/src/main/assets/rose_1.5.0.svga b/app/src/main/assets/rose_1.5.0.svga deleted file mode 100644 index 6f5e7cee..00000000 Binary files a/app/src/main/assets/rose_1.5.0.svga and /dev/null differ diff --git a/app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromAssetsActivity.java b/app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromAssetsActivity.java index 8bd664f1..81923330 100644 --- a/app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromAssetsActivity.java +++ b/app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromAssetsActivity.java @@ -59,7 +59,6 @@ private String randomSample() { samples.add("EmptyState.svga"); samples.add("heartbeat.svga"); samples.add("posche.svga"); - samples.add("rose_1.5.0.svga"); samples.add("rose_2.0.0.svga"); samples.add("test.svga"); samples.add("test2.svga"); diff --git a/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt b/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt index b5475593..bdc84839 100644 --- a/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt +++ b/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt @@ -26,6 +26,8 @@ class SVGADynamicEntity { internal var dynamicDrawer: HashMap Boolean> = hashMapOf() + internal var dynamicDrawerSized: HashMap Boolean> = hashMapOf() + internal var isTextDirty = false fun setHidden(value: Boolean, forKey: String) { @@ -38,7 +40,7 @@ class SVGADynamicEntity { fun setDynamicImage(url: String, forKey: String) { val handler = android.os.Handler() - thread { + SVGAParser.threadPoolExecutor.execute { (URL(url).openConnection() as? HttpURLConnection)?.let { try { it.connectTimeout = 20 * 1000 @@ -77,6 +79,10 @@ class SVGADynamicEntity { this.dynamicDrawer.put(forKey, drawer) } + fun setDynamicDrawerSized(drawer: (canvas: Canvas, frameIndex: Int, width: Int, height: Int) -> Boolean, forKey: String) { + this.dynamicDrawerSized.put(forKey, drawer) + } + fun clearDynamicObjects() { this.isTextDirty = true this.dynamicHidden.clear() @@ -85,6 +91,7 @@ class SVGADynamicEntity { this.dynamicTextPaint.clear() this.dynamicLayoutText.clear() this.dynamicDrawer.clear() + this.dynamicDrawerSized.clear() } } \ No newline at end of file diff --git a/library/src/main/java/com/opensource/svgaplayer/SVGAParser.kt b/library/src/main/java/com/opensource/svgaplayer/SVGAParser.kt index 76acb3e9..53761c19 100644 --- a/library/src/main/java/com/opensource/svgaplayer/SVGAParser.kt +++ b/library/src/main/java/com/opensource/svgaplayer/SVGAParser.kt @@ -38,7 +38,7 @@ class SVGAParser(private val context: Context) { val cancelBlock = { cancelled = true } - Thread { + threadPoolExecutor.execute { try { if (HttpResponseCache.getInstalled() == null && !noCache) { Log.e("SVGAParser", "SVGAParser can not handle cache before install HttpResponseCache. see https://github.com/yyued/SVGAPlayer-Android#cache") @@ -63,7 +63,7 @@ class SVGAParser(private val context: Context) { outputStream.write(buffer, 0, count) } if (cancelled) { - return@Thread + return@execute } ByteArrayInputStream(outputStream.toByteArray()).use { complete(it) @@ -75,18 +75,20 @@ class SVGAParser(private val context: Context) { e.printStackTrace() failure(e) } - }.start() + } return cancelBlock } } var fileDownloader = FileDownloader() - private var threadPoolBlockingQueue = LinkedBlockingQueue() - private var threadPoolExecutor = ThreadPoolExecutor(3, 10, 60000, TimeUnit.MILLISECONDS, this.threadPoolBlockingQueue) - protected fun finalize() { - threadPoolExecutor.shutdown() + companion object { + private val threadPoolBlockingQueue = LinkedBlockingQueue() + internal var threadPoolExecutor = ThreadPoolExecutor(3, 10, 60000, TimeUnit.MILLISECONDS, threadPoolBlockingQueue) + fun setThreadPoolExecutor(executor: ThreadPoolExecutor) { + threadPoolExecutor = executor + } } fun decodeFromAssets(name: String, callback: ParseCompletion) { @@ -131,9 +133,9 @@ class SVGAParser(private val context: Context) { else { inflate(bytes)?.let { val videoItem = SVGAVideoEntity(MovieEntity.ADAPTER.decode(it), File(cacheKey)) -// videoItem.prepare { + videoItem.prepare { this.invokeCompleteCallback(videoItem, callback) -// } + } } } } diff --git a/library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt b/library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt index 92ab6093..02867a42 100644 --- a/library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt +++ b/library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt @@ -273,6 +273,13 @@ internal class SVGACanvasDrawer(videoItem: SVGAVideoEntity, val dynamicItem: SVG it.invoke(canvas, frameIndex) canvas.restore() } + dynamicItem.dynamicDrawerSized[imageKey]?.let { + val frameMatrix = shareFrameMatrix(sprite.frameEntity.transform) + canvas.save() + canvas.concat(frameMatrix) + it.invoke(canvas, frameIndex, sprite.frameEntity.layout.width.toInt(), sprite.frameEntity.layout.height.toInt()) + canvas.restore() + } } class ShareValues {