@@ -172,12 +172,18 @@ open class SVGAImageView : ImageView {
172
172
}
173
173
174
174
fun startAnimation () {
175
+ startAnimation(null , false )
176
+ }
177
+
178
+ fun startAnimation (range : SVGARange ? , reverse : Boolean = false) {
175
179
val drawable = drawable as ? SVGADrawable ? : return
176
180
drawable.cleared = false
177
181
drawable.scaleType = scaleType
178
182
drawable.videoItem?.let {
179
183
var durationScale = 1.0
180
- val animator = ValueAnimator .ofInt(0 , it.frames - 1 )
184
+ val startFrame = Math .max(0 , range?.location ? : 0 )
185
+ val endFrame = Math .min(it.frames - 1 , ((range?.location ? : 0 ) + (range?.length ? : Int .MAX_VALUE ) - 1 ))
186
+ val animator = ValueAnimator .ofInt(startFrame, endFrame)
181
187
try {
182
188
Class .forName(" android.animation.ValueAnimator" )?.let {
183
189
it.getDeclaredField(" sDurationScale" )?.let {
@@ -189,7 +195,7 @@ open class SVGAImageView : ImageView {
189
195
}
190
196
} catch (e: Exception ) {}
191
197
animator.interpolator = LinearInterpolator ()
192
- animator.duration = (it.frames * (1000 / it.FPS ) / durationScale).toLong()
198
+ animator.duration = ((endFrame - startFrame + 1 ) * (1000 / it.FPS ) / durationScale).toLong()
193
199
animator.repeatCount = if (loops <= 0 ) 99999 else loops - 1
194
200
animator.addUpdateListener {
195
201
drawable.currentFrame = animator.animatedValue as Int
@@ -204,7 +210,10 @@ open class SVGAImageView : ImageView {
204
210
stopAnimation()
205
211
if (! clearsAfterStop) {
206
212
if (fillMode == FillMode .Backward ) {
207
- drawable.currentFrame = 0
213
+ drawable.currentFrame = startFrame
214
+ }
215
+ else if (fillMode == FillMode .Forward ) {
216
+ drawable.currentFrame = endFrame
208
217
}
209
218
}
210
219
callback?.onFinished()
@@ -216,7 +225,12 @@ open class SVGAImageView : ImageView {
216
225
isAnimating = true
217
226
}
218
227
})
219
- animator.start()
228
+ if (reverse) {
229
+ animator.reverse()
230
+ }
231
+ else {
232
+ animator.start()
233
+ }
220
234
this .animator = animator
221
235
}
222
236
}
0 commit comments