Skip to content

Commit d2a7193

Browse files
committed
add DynamicDrawer.
1 parent 2d8ff6c commit d2a7193

File tree

5 files changed

+58
-7
lines changed

5 files changed

+58
-7
lines changed

app/src/main/java/com/example/ponycui_home/svgaplayer/MainActivity.java

+10
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
import kotlin.Unit;
4848
import kotlin.jvm.functions.Function1;
49+
import kotlin.jvm.functions.Function2;
4950
import kotlin.jvm.functions.Function3;
5051
import okhttp3.CacheControl;
5152
import okhttp3.Call;
@@ -132,6 +133,15 @@ private SVGADynamicEntity requestDynamicItemWithSpannableText() {
132133
0.0f,
133134
false
134135
), "banner");
136+
dynamicEntity.setDynamicDrawer(new Function2<Canvas, Integer, Boolean>() {
137+
@Override
138+
public Boolean invoke(Canvas canvas, Integer frameIndex) {
139+
Paint aPaint = new Paint();
140+
aPaint.setColor(Color.WHITE);
141+
canvas.drawCircle(50, 54, frameIndex % 5, aPaint);
142+
return false;
143+
}
144+
}, "banner");
135145
return dynamicEntity;
136146
}
137147

library/src/main/java/com/opensource/svgaplayer/SVGACanvasDrawer.kt

+14-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class SVGACanvasDrawer(videoItem: SVGAVideoEntity, val dynamicItem: SVGADynamicE
2626
resetCachePath(canvas)
2727
val sprites = requestFrameSprites(frameIndex)
2828
sprites.forEach {
29-
drawSprite(it,canvas)
29+
drawSprite(it, canvas, frameIndex)
3030
}
3131
}
3232

@@ -45,9 +45,10 @@ class SVGACanvasDrawer(videoItem: SVGAVideoEntity, val dynamicItem: SVGADynamicE
4545
sharedFrameMatrix.preConcat(transform)
4646
}
4747

48-
private fun drawSprite(sprite: SVGADrawerSprite,canvas :Canvas) {
48+
private fun drawSprite(sprite: SVGADrawerSprite, canvas :Canvas, frameIndex: Int) {
4949
drawImage(sprite, canvas)
5050
drawShape(sprite, canvas)
51+
drawDynamic(sprite, canvas, frameIndex)
5152
}
5253

5354
private fun drawImage(sprite: SVGADrawerSprite, canvas :Canvas) {
@@ -260,4 +261,15 @@ class SVGACanvasDrawer(videoItem: SVGAVideoEntity, val dynamicItem: SVGADynamicE
260261
}
261262
}
262263

264+
private fun drawDynamic(sprite: SVGADrawerSprite, canvas: Canvas, frameIndex: Int) {
265+
val imageKey = sprite.imageKey ?: return
266+
dynamicItem.dynamicDrawer[imageKey]?.let {
267+
resetShareMatrix(sprite.frameEntity.transform)
268+
canvas.save()
269+
canvas.concat(sharedFrameMatrix)
270+
it.invoke(canvas, frameIndex)
271+
canvas.restore()
272+
}
273+
}
274+
263275
}

library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt

+13-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.opensource.svgaplayer
22

33
import android.graphics.Bitmap
44
import android.graphics.BitmapFactory
5+
import android.graphics.Canvas
56
import android.text.Layout
67
import android.text.SpannableString
78
import android.text.StaticLayout
@@ -17,15 +18,17 @@ import java.util.logging.Handler
1718
*/
1819
class SVGADynamicEntity {
1920

20-
var dynamicHidden: HashMap<String, Boolean> = hashMapOf()
21+
internal var dynamicHidden: HashMap<String, Boolean> = hashMapOf()
2122

22-
var dynamicImage: HashMap<String, Bitmap> = hashMapOf()
23+
internal var dynamicImage: HashMap<String, Bitmap> = hashMapOf()
2324

24-
var dynamicText: HashMap<String, String> = hashMapOf()
25+
internal var dynamicText: HashMap<String, String> = hashMapOf()
2526

26-
var dynamicTextPaint: HashMap<String, TextPaint> = hashMapOf()
27+
internal var dynamicTextPaint: HashMap<String, TextPaint> = hashMapOf()
2728

28-
var dynamicLayoutText: HashMap<String, StaticLayout> = hashMapOf()
29+
internal var dynamicLayoutText: HashMap<String, StaticLayout> = hashMapOf()
30+
31+
internal var dynamicDrawer: HashMap<String, (canvas: Canvas, frameIndex: Int) -> Boolean> = hashMapOf()
2932

3033
internal var isTextDirty = false
3134

@@ -67,13 +70,18 @@ class SVGADynamicEntity {
6770
this.dynamicLayoutText.put(forKey, layoutText)
6871
}
6972

73+
fun setDynamicDrawer(drawer: (canvas: Canvas, frameIndex: Int) -> Boolean, forKey: String) {
74+
this.dynamicDrawer.put(forKey, drawer)
75+
}
76+
7077
fun clearDynamicObjects() {
7178
this.isTextDirty = true
7279
this.dynamicHidden.clear()
7380
this.dynamicImage.clear()
7481
this.dynamicText.clear()
7582
this.dynamicTextPaint.clear()
7683
this.dynamicLayoutText.clear()
84+
this.dynamicDrawer.clear()
7785
}
7886

7987
}

library/src/main/java/com/opensource/svgaplayer/SVGAImageView.kt

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ open class SVGAImageView : ImageView {
113113
override fun onDetachedFromWindow() {
114114
super.onDetachedFromWindow()
115115
animator?.cancel()
116+
animator?.removeAllListeners()
116117
animator?.removeAllUpdateListeners()
117118
}
118119

readme.md

+20
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ If you want to run Sample Project on Android Studio 2.3.2, Download this [commit
1414

1515
## Version
1616

17+
### 2.1.2
18+
19+
* Feature: Add DynamicDrawer to DynamicEntity.
20+
1721
### 2.1.1
1822

1923
* Improve: Improve performances, arrange code. Thanks @andyliumstar.
@@ -222,4 +226,20 @@ Now use setHidden to hide an element prevents drawing.
222226

223227
```java
224228
dynamicItem.setHidden(true, "ImageKey")
229+
```
230+
231+
### Dynamic Drawer
232+
233+
You can set a drawer function above specific item, draw over canvas by yourself.
234+
235+
```java
236+
dynamicItem.setDynamicDrawer(new Function2<Canvas, Integer, Boolean>() {
237+
@Override
238+
public Boolean invoke(Canvas canvas, Integer frameIndex) {
239+
Paint aPaint = new Paint();
240+
aPaint.setColor(Color.WHITE);
241+
canvas.drawCircle(50, 54, frameIndex % 5, aPaint);
242+
return false;
243+
}
244+
}, "banner");
225245
```

0 commit comments

Comments
 (0)