Skip to content
This repository was archived by the owner on Feb 6, 2023. It is now read-only.

Commit 1c13a21

Browse files
Merge branch 'dev'
2 parents 5d2f3e4 + 9771445 commit 1c13a21

7 files changed

Lines changed: 69 additions & 39 deletions

File tree

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.graphics.Color;
55
import android.os.Bundle;
66
import android.support.annotation.Nullable;
7+
import android.util.Log;
78
import android.view.View;
89

910
import com.opensource.svgaplayer.SVGAImageView;
@@ -35,7 +36,11 @@ public void onClick(View view) {
3536
}
3637

3738
private void loadAnimation() {
38-
SVGAParser.Companion.shareParser().decodeFromAssets(this.randomSample(), new SVGAParser.ParseCompletion() {
39+
SVGAParser svgaParser = SVGAParser.Companion.shareParser();
40+
String name = this.randomSample();
41+
Log.d("SVGA", "## name " + name);
42+
svgaParser.setFrameSize(100, 100);
43+
svgaParser.decodeFromAssets(name, new SVGAParser.ParseCompletion() {
3944
@Override
4045
public void onComplete(@NotNull SVGAVideoEntity videoItem) {
4146
animationView.setVideoItem(videoItem);

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import android.graphics.Color;
55
import android.os.Bundle;
66
import android.support.annotation.Nullable;
7+
import android.util.Log;
8+
import android.view.ViewGroup;
79

810
import com.opensource.svgaplayer.SVGAImageView;
911
import com.opensource.svgaplayer.SVGAParser;
@@ -23,15 +25,18 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
2325
super.onCreate(savedInstanceState);
2426
animationView = new SVGAImageView(this);
2527
animationView.setBackgroundColor(Color.GRAY);
26-
loadAnimation();
2728
setContentView(animationView);
29+
loadAnimation();
2830
}
2931

3032
private void loadAnimation() {
3133
try { // new URL needs try catch.
32-
SVGAParser.Companion.shareParser().decodeFromURL(new URL("https://github.com/yyued/SVGA-Samples/blob/master/posche.svga?raw=true"), new SVGAParser.ParseCompletion() {
34+
SVGAParser svgaParser = SVGAParser.Companion.shareParser();
35+
svgaParser.setFrameSize(100,100);
36+
svgaParser.decodeFromURL(new URL("https://github.com/yyued/SVGA-Samples/blob/master/posche.svga?raw=true"), new SVGAParser.ParseCompletion() {
3337
@Override
3438
public void onComplete(@NotNull SVGAVideoEntity videoItem) {
39+
Log.d("##","## FromNetworkActivity load onComplete");
3540
animationView.setVideoItem(videoItem);
3641
animationView.startAnimation();
3742
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ open class SVGAImageView @JvmOverloads constructor(context: Context, attrs: Attr
134134
val drawable = getSVGADrawable() ?: return
135135
drawable.cleared = false
136136
drawable.scaleType = scaleType
137-
drawable.videoItem.parserResourceWithViewSize(width, height)
138137
}
139138

140139
private fun getSVGADrawable(): SVGADrawable? {

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ private var fileLock: Int = 0
2626
class SVGAParser(context: Context?) {
2727
private var mContextRef = WeakReference(context)
2828

29+
@Volatile
30+
private var mFrameWidth: Int = 0
31+
32+
@Volatile
33+
private var mFrameHeight: Int = 0
34+
2935
interface ParseCompletion {
3036
fun onComplete(videoItem: SVGAVideoEntity)
3137
fun onError()
@@ -86,15 +92,16 @@ class SVGAParser(context: Context?) {
8692

8793
companion object {
8894
private val threadNum = AtomicInteger(0)
95+
private var mShareParser = SVGAParser(null)
96+
8997
internal var threadPoolExecutor = Executors.newCachedThreadPool { r ->
90-
Thread(r, "SVGAParser-Thread-${threadNum.getAndIncrement()}")
98+
Thread(r, "SVGAParser-Thread-${threadNum.getAndIncrement()}")
9199
}
92100

93101
fun setThreadPoolExecutor(executor: ThreadPoolExecutor) {
94102
threadPoolExecutor = executor
95103
}
96104

97-
private var mShareParser = SVGAParser(null)
98105
fun shareParser(): SVGAParser {
99106
return mShareParser
100107
}
@@ -104,6 +111,11 @@ class SVGAParser(context: Context?) {
104111
mContextRef = WeakReference<Context?>(context)
105112
}
106113

114+
fun setFrameSize(frameWidth: Int, frameHeight: Int) {
115+
mFrameWidth = frameWidth
116+
mFrameHeight = frameHeight
117+
}
118+
107119
fun decodeFromAssets(name: String, callback: ParseCompletion?) {
108120
if (mContextRef.get() == null) {
109121
Log.e("SVGAParser", "在配置 SVGAParser context 前, 无法解析 SVGA 文件。")
@@ -149,7 +161,7 @@ class SVGAParser(context: Context?) {
149161
}
150162
else {
151163
inflate(bytes)?.let {
152-
val videoItem = SVGAVideoEntity(MovieEntity.ADAPTER.decode(it), File(cacheKey))
164+
val videoItem = SVGAVideoEntity(MovieEntity.ADAPTER.decode(it), File(cacheKey), mFrameWidth, mFrameHeight)
153165
videoItem.prepare {
154166
this.invokeCompleteCallback(videoItem, callback)
155167
}
@@ -222,7 +234,7 @@ class SVGAParser(context: Context?) {
222234
File(cacheDir, "movie.binary").takeIf { it.isFile }?.let { binaryFile ->
223235
try {
224236
FileInputStream(binaryFile).use {
225-
this.invokeCompleteCallback(SVGAVideoEntity(MovieEntity.ADAPTER.decode(it), cacheDir), callback)
237+
this.invokeCompleteCallback(SVGAVideoEntity(MovieEntity.ADAPTER.decode(it), cacheDir, mFrameWidth, mFrameHeight), callback)
226238
}
227239
} catch (e: Exception) {
228240
cacheDir.delete()
@@ -244,7 +256,7 @@ class SVGAParser(context: Context?) {
244256
}
245257
byteArrayOutputStream.toString().let {
246258
JSONObject(it).let {
247-
this.invokeCompleteCallback(SVGAVideoEntity(it, cacheDir), callback)
259+
this.invokeCompleteCallback(SVGAVideoEntity(it, cacheDir, mFrameWidth, mFrameHeight), callback)
248260
}
249261
}
250262
}

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

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,30 @@ class SVGAVideoEntity {
3636
var frames: Int = 0
3737
private set
3838

39-
private var reqHeight = 0
40-
private var reqWidth = 0
4139
internal var spriteList: List<SVGAVideoSpriteEntity> = emptyList()
4240
internal var audioList: List<SVGAAudioEntity> = emptyList()
4341
internal var soundPool: SoundPool? = null
4442
internal var imageMap = HashMap<String, Bitmap>()
4543
private var mCacheDir: File
46-
private var mJsonMovie: JSONObject? = null
44+
private var mFrameHeight = 0
45+
private var mFrameWidth = 0
4746

48-
constructor(json: JSONObject, cacheDir: File) {
49-
mJsonMovie = json
47+
constructor(json: JSONObject, cacheDir: File) : this(json, cacheDir, 0, 0)
48+
49+
constructor(json: JSONObject, cacheDir: File, frameWidth: Int, frameHeight: Int) {
50+
mFrameWidth = frameWidth
51+
mFrameHeight = frameHeight
5052
mCacheDir = cacheDir
51-
json.optJSONObject("movie")?.let(this::setupByJson)
53+
val movieJsonObject = json.optJSONObject("movie") ?: return
54+
setupByJson(movieJsonObject)
55+
try {
56+
parserImages(json)
57+
} catch (e: Exception) {
58+
e.printStackTrace()
59+
} catch (e: OutOfMemoryError) {
60+
e.printStackTrace()
61+
}
62+
resetSprites(json)
5263
}
5364

5465
private fun setupByJson(movieObject: JSONObject) {
@@ -61,10 +72,22 @@ class SVGAVideoEntity {
6172
frames = movieObject.optInt("frames", 0)
6273
}
6374

64-
internal constructor(entity: MovieEntity, cacheDir: File) {
65-
this.movieItem = entity
75+
constructor(entity: MovieEntity, cacheDir: File) : this(entity, cacheDir, 0, 0)
76+
77+
constructor(entity: MovieEntity, cacheDir: File, frameWidth: Int, frameHeight: Int) {
78+
this.mFrameWidth = frameWidth
79+
this.mFrameHeight = frameHeight
6680
this.mCacheDir = cacheDir
67-
entity.params?.let (this::setupByMovie)
81+
this.movieItem = entity
82+
entity.params?.let(this::setupByMovie)
83+
try {
84+
parserImages(entity)
85+
} catch (e: Exception) {
86+
e.printStackTrace()
87+
} catch (e: OutOfMemoryError) {
88+
e.printStackTrace()
89+
}
90+
resetSprites(entity)
6891
}
6992

7093
private fun setupByMovie(movieParams: MovieParams) {
@@ -85,25 +108,6 @@ class SVGAVideoEntity {
85108
}
86109
}
87110

88-
internal fun parserResourceWithViewSize(reqWidth: Int, reqHeight: Int) {
89-
this.reqWidth = reqWidth
90-
this.reqHeight = reqHeight
91-
92-
try {
93-
if (mJsonMovie != null) {
94-
parserImages(mJsonMovie!!)
95-
resetSprites(mJsonMovie!!)
96-
} else if (movieItem != null) {
97-
parserImages(movieItem!!)
98-
resetSprites(movieItem!!)
99-
}
100-
} catch (e: Exception) {
101-
e.printStackTrace()
102-
} catch (e: OutOfMemoryError) {
103-
e.printStackTrace()
104-
}
105-
}
106-
107111
private fun parserImages(json: JSONObject) {
108112
val imgJson = json.optJSONObject("images") ?: return
109113
imgJson.keys().forEach { imgKey ->
@@ -133,7 +137,7 @@ class SVGAVideoEntity {
133137
}
134138

135139
private fun createBitmap(filePath: String): Bitmap? {
136-
return SVGABitmapFileDecoder.decodeBitmapFrom(filePath, reqWidth, reqHeight)
140+
return SVGABitmapFileDecoder.decodeBitmapFrom(filePath, mFrameWidth, mFrameHeight)
137141
}
138142

139143
private fun parserImages(obj: MovieEntity) {
@@ -154,7 +158,7 @@ class SVGAVideoEntity {
154158
}
155159

156160
private fun createBitmap(byteArray: ByteArray, filePath: String): Bitmap? {
157-
val bitmap = SVGABitmapByteArrayDecoder.decodeBitmapFrom(byteArray, reqWidth, reqHeight)
161+
val bitmap = SVGABitmapByteArrayDecoder.decodeBitmapFrom(byteArray, mFrameWidth, mFrameHeight)
158162
return bitmap ?: createBitmap(filePath)
159163
}
160164

library/src/main/java/com/opensource/svgaplayer/bitmap/SVGABitmapDecoder.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.opensource.svgaplayer.bitmap
22

33
import android.graphics.Bitmap
44
import android.graphics.BitmapFactory
5+
import android.util.Log
56
import com.opensource.svgaplayer.utils.BitmapUtils
67

78
/**
@@ -26,6 +27,7 @@ internal abstract class SVGABitmapDecoder<T> {
2627

2728
// Calculate inSampleSize
2829
inSampleSize = BitmapUtils.calculateInSampleSize(this, reqWidth, reqHeight)
30+
Log.d("##SVGA","## SVGABitmapDecoder inSampleSize $inSampleSize")
2931
// Decode bitmap with inSampleSize set
3032
inJustDecodeBounds = false
3133
onDecode(data, this)

library/src/main/java/com/opensource/svgaplayer/utils/BitmapUtils.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.opensource.svgaplayer.utils
22

33
import android.graphics.BitmapFactory
4+
import android.util.Log
45

56
/**
67
*
@@ -12,6 +13,8 @@ internal object BitmapUtils {
1213
// Raw height and width of image
1314
val (height: Int, width: Int) = options.run { outHeight to outWidth }
1415
var inSampleSize = 1
16+
Log.d("##SVGA","## calculateInSampleSize $reqWidth $reqHeight $width $height")
17+
1518
if (reqHeight <= 0 || reqWidth <= 0) {
1619
return inSampleSize
1720
}

0 commit comments

Comments
 (0)