Skip to content

Commit 6c46efc

Browse files
committed
Add ApngAnimatorOptions and move oupson.apng.Utils to oupson.apng.utils.Utils
1 parent 351ee29 commit 6c46efc

File tree

8 files changed

+68
-30
lines changed

8 files changed

+68
-30
lines changed

apng_library/src/main/java/oupson/apng/APNGDisassembler.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package oupson.apng
22

33
import android.graphics.BitmapFactory
4-
import oupson.apng.Utils.Companion.isApng
5-
import oupson.apng.Utils.Companion.pngSignature
6-
import oupson.apng.Utils.Companion.to4Bytes
4+
import oupson.apng.utils.Utils.Companion.isApng
5+
import oupson.apng.utils.Utils.Companion.pngSignature
6+
import oupson.apng.utils.Utils.Companion.to4Bytes
77
import oupson.apng.chunks.IHDR
88
import oupson.apng.chunks.fcTL
99
import oupson.apng.exceptions.NotApngException
10+
import oupson.apng.utils.Utils
1011
import java.util.zip.CRC32
1112

1213
class APNGDisassembler {

apng_library/src/main/java/oupson/apng/Apng.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ package oupson.apng
33
import android.graphics.Bitmap
44
import android.graphics.BitmapFactory
55
import oupson.apng.ImageUtils.PnnQuantizer
6-
import oupson.apng.Utils.Companion.getBlend_op
7-
import oupson.apng.Utils.Companion.getDispose_op
8-
import oupson.apng.Utils.Companion.pngSignature
9-
import oupson.apng.Utils.Companion.to2Bytes
10-
import oupson.apng.Utils.Companion.to4Bytes
11-
import oupson.apng.Utils.Companion.toByteArray
6+
import oupson.apng.utils.Utils.Companion.getBlend_op
7+
import oupson.apng.utils.Utils.Companion.getDispose_op
8+
import oupson.apng.utils.Utils.Companion.pngSignature
9+
import oupson.apng.utils.Utils.Companion.to2Bytes
10+
import oupson.apng.utils.Utils.Companion.to4Bytes
11+
import oupson.apng.utils.Utils.Companion.toByteArray
1212
import oupson.apng.chunks.IDAT
1313
import oupson.apng.exceptions.NoFrameException
14+
import oupson.apng.utils.Utils
1415
import java.util.zip.CRC32
1516

1617

apng_library/src/main/java/oupson/apng/ApngAnimator.kt

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ import android.graphics.*
66
import android.net.Uri
77
import android.widget.ImageView
88
import org.jetbrains.anko.doAsync
9+
import org.jetbrains.anko.image
910
import org.jetbrains.anko.runOnUiThread
1011
import org.jetbrains.anko.uiThread
11-
import oupson.apng.Utils.Companion.isApng
12+
import oupson.apng.utils.Utils.Companion.isApng
1213
import oupson.apng.exceptions.NotApngException
14+
import oupson.apng.utils.ApngAnimatorOptions
15+
import oupson.apng.utils.Utils
1316
import java.io.File
1417
import java.net.URL
1518

@@ -41,6 +44,7 @@ class ApngAnimator(private val context: Context) {
4144
private var doOnLoaded : (ApngAnimator) -> Unit = {}
4245
private var AnimationLoopListener : () -> Unit = {}
4346
private var duration : ArrayList<Float>? = null
47+
private var scaleType : ImageView.ScaleType? = null
4448

4549
var isApng = false
4650
var loadNotApng = true
@@ -74,7 +78,7 @@ class ApngAnimator(private val context: Context) {
7478
* @param speed The speed
7579
* @throws NotApngException
7680
*/
77-
fun load(file: File, speed: Float? = null) {
81+
fun load(file: File, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) {
7882
doAsync {
7983
val bytes = file.readBytes()
8084
if (isApng(bytes)) {
@@ -84,10 +88,12 @@ class ApngAnimator(private val context: Context) {
8488
APNGDisassembler.disassemble(file.readBytes()).frames.apply {
8589
draw(this)
8690
}
91+
scaleType = apngAnimatorOptions?.scaleType
8792
setupAnimationDrawableAndStart()
8893
} else {
8994
if (loadNotApng) {
9095
context.runOnUiThread {
96+
imageView?.scaleType = this@ApngAnimator.scaleType ?: ImageView.ScaleType.FIT_CENTER
9197
imageView?.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.size))
9298
}
9399
} else {
@@ -103,7 +109,7 @@ class ApngAnimator(private val context: Context) {
103109
* @param speed The speed
104110
* @throws NotApngException
105111
*/
106-
fun load(uri : Uri, speed: Float? = null) {
112+
fun load(uri : Uri, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) {
107113
doAsync {
108114
val bytes = context.contentResolver.openInputStream(uri).readBytes()
109115
if (isApng(bytes)) {
@@ -113,10 +119,12 @@ class ApngAnimator(private val context: Context) {
113119
APNGDisassembler.disassemble(bytes).frames.apply {
114120
draw(this)
115121
}
122+
scaleType = apngAnimatorOptions?.scaleType
116123
setupAnimationDrawableAndStart()
117124
} else {
118125
if (loadNotApng) {
119126
context.runOnUiThread {
127+
imageView?.scaleType = this@ApngAnimator.scaleType ?: ImageView.ScaleType.FIT_CENTER
120128
imageView?.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.size))
121129
}
122130
} else {
@@ -132,7 +140,7 @@ class ApngAnimator(private val context: Context) {
132140
* @param speed The speed
133141
* @throws NotApngException
134142
*/
135-
fun loadUrl(url: URL, speed: Float? = null) {
143+
fun loadUrl(url: URL, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) {
136144
doAsync(exceptionHandler = { e -> e.printStackTrace() }) {
137145
this@ApngAnimator.speed = speed
138146
// Download PNG
@@ -142,10 +150,12 @@ class ApngAnimator(private val context: Context) {
142150
APNGDisassembler.disassemble(this).frames.apply {
143151
draw(this)
144152
}
153+
scaleType = apngAnimatorOptions?.scaleType
145154
setupAnimationDrawableAndStart()
146155
} else {
147156
if (loadNotApng) {
148157
context.runOnUiThread {
158+
imageView?.scaleType = this@ApngAnimator.scaleType ?: ImageView.ScaleType.FIT_CENTER
149159
imageView?.setImageBitmap(BitmapFactory.decodeByteArray(this@apply, 0, this@apply.size))
150160
}
151161
} else {
@@ -165,18 +175,20 @@ class ApngAnimator(private val context: Context) {
165175
* @param speed The speed
166176
* @throws NotApngException
167177
*/
168-
fun load(byteArray: ByteArray, speed: Float? = null) {
178+
fun load(byteArray: ByteArray, speed: Float? = null, apngAnimatorOptions: ApngAnimatorOptions?) {
169179
doAsync {
170180
this@ApngAnimator.speed = speed
171181
if (isApng(byteArray)) {
172182
isApng = true
173183
APNGDisassembler.disassemble(byteArray).frames.apply {
174184
draw(this)
175185
}
186+
scaleType = apngAnimatorOptions?.scaleType
176187
setupAnimationDrawableAndStart()
177188
} else {
178189
if (loadNotApng) {
179190
context.runOnUiThread {
191+
imageView?.scaleType = this@ApngAnimator.scaleType ?: ImageView.ScaleType.FIT_CENTER
180192
imageView?.setImageBitmap(BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size))
181193
}
182194
} else {
@@ -192,18 +204,18 @@ class ApngAnimator(private val context: Context) {
192204
* @param speed The speed
193205
* @throws NotApngException
194206
*/
195-
fun load(string: String, speed : Float? = null) {
207+
fun load(string: String, speed : Float? = null, apngAnimatorOptions: ApngAnimatorOptions? = null) {
196208
doAsync {
197209
this@ApngAnimator.speed = speed
198210
if (string.contains("http") || string.contains("https")) {
199211
val url = URL(string)
200-
loadUrl(url, speed)
212+
loadUrl(url, speed, apngAnimatorOptions)
201213
} else if (File(string).exists()) {
202214
var pathToLoad = if (string.startsWith("content://")) string else "file://$string"
203215
pathToLoad = pathToLoad.replace("%", "%25").replace("#", "%23")
204216
val bytes = context.contentResolver.openInputStream(Uri.parse(pathToLoad)).readBytes()
205217
if (isApng(bytes)) {
206-
load(bytes, speed)
218+
load(bytes, speed, apngAnimatorOptions)
207219
} else {
208220
if (loadNotApng) {
209221
context.runOnUiThread {
@@ -226,10 +238,12 @@ class ApngAnimator(private val context: Context) {
226238
activeAnimation = anim
227239
uiThread {
228240
imageView?.apply {
241+
scaleType = this@ApngAnimator.scaleType ?: ImageView.ScaleType.FIT_CENTER
229242
setImageBitmap(generatedFrame[0])
230243
setImageDrawable(activeAnimation)
231244
}
232245
activeAnimation?.start()
246+
isPlaying = true
233247
doOnLoaded(this@ApngAnimator)
234248
}
235249
}
@@ -343,6 +357,20 @@ class ApngAnimator(private val context: Context) {
343357
doOnLoaded = f
344358
}
345359

360+
fun centerCrop(boolean: Boolean) {
361+
if (isApng) {
362+
if (boolean) {
363+
imageView?.scaleType = ImageView.ScaleType.CENTER_CROP
364+
pause()
365+
play()
366+
} else {
367+
imageView?.scaleType = null
368+
pause()
369+
play()
370+
}
371+
}
372+
}
373+
346374
/**
347375
* Converts the generated frames into an animation drawable ([CustomAnimationDrawable])
348376
* in the APNG will be used instead.

apng_library/src/main/java/oupson/apng/Frame.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package oupson.apng
22

33
import android.graphics.BitmapFactory
4-
import oupson.apng.Utils.Companion.isPng
5-
import oupson.apng.Utils.Companion.toByteArray
4+
import oupson.apng.utils.Utils.Companion.isPng
5+
import oupson.apng.utils.Utils.Companion.toByteArray
66
import oupson.apng.chunks.IDAT
77
import oupson.apng.chunks.IHDR
88
import oupson.apng.exceptions.NotPngException
9+
import oupson.apng.utils.Utils
910

1011
/**
1112
* A frame for an animated png

apng_library/src/main/java/oupson/apng/chunks/fcTL.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package oupson.apng.chunks
22

3-
import oupson.apng.Utils
4-
import oupson.apng.Utils.Companion.getBlend_op
5-
import oupson.apng.Utils.Companion.getDispose_op
3+
import oupson.apng.utils.Utils
4+
import oupson.apng.utils.Utils.Companion.getBlend_op
5+
import oupson.apng.utils.Utils.Companion.getDispose_op
66

77
class fcTL(byteArray: ByteArray) {
88

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package oupson.apng.utils
2+
3+
import android.widget.ImageView
4+
5+
class ApngAnimatorOptions(val scaleType : ImageView.ScaleType? = ImageView.ScaleType.FIT_CENTER)

apng_library/src/main/java/oupson/apng/Utils.kt renamed to apng_library/src/main/java/oupson/apng/utils/Utils.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package oupson.apng
1+
package oupson.apng.utils
22

33
import android.graphics.Bitmap
44
import android.graphics.Canvas
@@ -69,9 +69,9 @@ class Utils {
6969
*/
7070
fun getDispose_op(int: Int) : dispose_op {
7171
return when(int) {
72-
0 -> Companion.dispose_op.APNG_DISPOSE_OP_NONE
73-
1 -> Companion.dispose_op.APNG_DISPOSE_OP_BACKGROUND
74-
2 -> Companion.dispose_op.APNG_DISPOSE_OP_PREVIOUS
72+
0 -> dispose_op.APNG_DISPOSE_OP_NONE
73+
1 -> dispose_op.APNG_DISPOSE_OP_BACKGROUND
74+
2 -> dispose_op.APNG_DISPOSE_OP_PREVIOUS
7575
else -> dispose_op.APNG_DISPOSE_OP_NONE
7676
}
7777
}
@@ -98,10 +98,10 @@ class Utils {
9898
* @param int Int of the blend_op
9999
* @return A blend_op
100100
*/
101-
fun getBlend_op(int : Int) : blend_op{
101+
fun getBlend_op(int : Int) : blend_op {
102102
return when(int) {
103-
0 -> Companion.blend_op.APNG_BLEND_OP_SOURCE
104-
1 -> Companion.blend_op.APNG_BLEND_OP_OVER
103+
0 -> blend_op.APNG_BLEND_OP_SOURCE
104+
1 -> blend_op.APNG_BLEND_OP_OVER
105105
else -> blend_op.APNG_BLEND_OP_SOURCE
106106
}
107107
}

app-test/src/main/java/oupson/apngcreator/Main2Activity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import android.support.v4.app.ActivityCompat
77
import android.support.v4.content.ContextCompat
88
import android.support.v7.app.AppCompatActivity
99
import android.view.View
10+
import android.widget.ImageView
1011
import kotlinx.android.synthetic.main.activity_main2.*
1112
import org.jetbrains.anko.sdk27.coroutines.onClick
1213
import oupson.apng.ApngAnimator
14+
import oupson.apng.utils.ApngAnimatorOptions
1315

1416

1517
class Main2Activity : AppCompatActivity() {
@@ -40,7 +42,7 @@ class Main2Activity : AppCompatActivity() {
4042
fun load() {
4143
val animator = ApngAnimator(applicationContext).loadInto(imageView3)
4244
val uri = intent.data
43-
animator.load(uri)
45+
animator.load(uri, null, ApngAnimatorOptions(ImageView.ScaleType.CENTER_CROP))
4446
imageView3.onClick {
4547
try {
4648
if (animator.isPlaying) {

0 commit comments

Comments
 (0)