From eee0cbde197b9c2e0dc355a78c85a0b8b7e89176 Mon Sep 17 00:00:00 2001 From: miaojun Date: Wed, 8 Jan 2020 18:49:23 +0800 Subject: [PATCH] suport recycleview --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 1 + .../svgaplayer/AnimationFromRVActivity.java | 110 ++++++++++++++++++ .../ponycui_home/svgaplayer/MainActivity.java | 1 + app/src/main/res/layout/item_svga.xml | 7 ++ .../svgaplayer/SVGADynamicEntity.kt | 58 ++++----- .../opensource/svgaplayer/SVGARVImageView.kt | 28 +++++ 7 files changed, 177 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromRVActivity.java create mode 100644 app/src/main/res/layout/item_svga.xml create mode 100644 library/src/main/java/com/opensource/svgaplayer/SVGARVImageView.kt diff --git a/app/build.gradle b/app/build.gradle index dd61cd40..fef93c31 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,4 +33,5 @@ dependencies { implementation project(':library') implementation 'com.squareup.okhttp3:okhttp:3.4.1' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:recyclerview-v7:28.0.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 16d7ab8f..4b60a0d8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,7 @@ + diff --git a/app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromRVActivity.java b/app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromRVActivity.java new file mode 100644 index 00000000..61233d96 --- /dev/null +++ b/app/src/main/java/com/example/ponycui_home/svgaplayer/AnimationFromRVActivity.java @@ -0,0 +1,110 @@ +package com.example.ponycui_home.svgaplayer; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.opensource.svgaplayer.SVGAParser; +import com.opensource.svgaplayer.SVGARVImageView; +import com.opensource.svgaplayer.SVGAVideoEntity; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by miaojun on 2020-01-08. + * mail:1290846731@qq.com + */ +public class AnimationFromRVActivity extends Activity { + RecyclerView mSvgaRecycleView; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mSvgaRecycleView = new RecyclerView(this); + setContentView(mSvgaRecycleView); + + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + mSvgaRecycleView.setLayoutManager(linearLayoutManager); + SVGAListAdapter adapter = new SVGAListAdapter(); + adapter.setDataList(getList()); + mSvgaRecycleView.setAdapter(adapter); + } + + private List getList() { + List list = new ArrayList<>(); + for (int i = 0; i < 30; i++) { + ItemSVGABean bean = new ItemSVGABean(); + bean.name = "test2.svga"; + bean.isNeedResume = true; + list.add(bean); + } + return list; + } + + class SVGAListAdapter extends RecyclerView.Adapter { + List dataList = new ArrayList<>(); + + void setDataList(List list) { + dataList.clear(); + dataList.addAll(list); + } + + @NonNull + @Override + public SVGAListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + View view = LayoutInflater.from(viewGroup.getContext()) + .inflate(R.layout.item_svga, viewGroup, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull SVGAListAdapter.ViewHolder viewHolder, int i) { + viewHolder.setItem(dataList.get(i)); + } + + @Override + public int getItemCount() { + return dataList.size(); + } + + + class ViewHolder extends RecyclerView.ViewHolder { + + ViewHolder(@NonNull View itemView) { + super(itemView); + } + + void setItem(ItemSVGABean bean) { + ((SVGARVImageView) itemView).setNeedResume(bean.isNeedResume); + SVGAParser parser = new SVGAParser(itemView.getContext()); + parser.decodeFromAssets(bean.name, new SVGAParser.ParseCompletion() { + @Override + public void onComplete(@NotNull SVGAVideoEntity videoItem) { + ((SVGARVImageView) itemView).setVideoItem(videoItem); + ((SVGARVImageView) itemView).startAnimation(); + } + + @Override + public void onError() { + + } + }); + } + + } + } + + class ItemSVGABean { + String name; + boolean isNeedResume; + } +} diff --git a/app/src/main/java/com/example/ponycui_home/svgaplayer/MainActivity.java b/app/src/main/java/com/example/ponycui_home/svgaplayer/MainActivity.java index d778582a..ea6645f6 100644 --- a/app/src/main/java/com/example/ponycui_home/svgaplayer/MainActivity.java +++ b/app/src/main/java/com/example/ponycui_home/svgaplayer/MainActivity.java @@ -76,6 +76,7 @@ void setupData() { this.items.add(new SampleItem("Animation From Layout XML", new Intent(this, AnimationFromLayoutActivity.class))); this.items.add(new SampleItem("Animation With Dynamic Image", new Intent(this, AnimationWithDynamicImageActivity.class))); this.items.add(new SampleItem("Animation With Dynamic Click", new Intent(this, AnimationFromClickActivity.class))); + this.items.add(new SampleItem("Animation With RecycleView", new Intent(this, AnimationFromRVActivity.class))); } void setupListView() { diff --git a/app/src/main/res/layout/item_svga.xml b/app/src/main/res/layout/item_svga.xml new file mode 100644 index 00000000..ffd94d0c --- /dev/null +++ b/app/src/main/res/layout/item_svga.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt b/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt index 19bbf07d..d59b15a0 100644 --- a/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt +++ b/library/src/main/java/com/opensource/svgaplayer/SVGADynamicEntity.kt @@ -30,9 +30,8 @@ class SVGADynamicEntity { internal var dynamicDrawer: HashMap Boolean> = hashMapOf() - //点击事件回调map - internal var mClickMap : HashMap = hashMapOf() + internal var mClickMap: HashMap = hashMapOf() internal var dynamicIClickArea: HashMap = hashMapOf() internal var dynamicDrawerSized: HashMap Boolean> = hashMapOf() @@ -87,8 +86,8 @@ class SVGADynamicEntity { fun setDynamicText(layoutText: BoringLayout, forKey: String) { this.isTextDirty = true - BoringLayout.isBoring(layoutText.text,layoutText.paint)?.let { - this.dynamicBoringLayoutText.put(forKey,layoutText) + BoringLayout.isBoring(layoutText.text, layoutText.paint)?.let { + this.dynamicBoringLayoutText.put(forKey, layoutText) } } @@ -98,13 +97,13 @@ class SVGADynamicEntity { fun setClickArea(clickKey: List) { - for(itemKey in clickKey){ - dynamicIClickArea.put(itemKey,object : IClickAreaListener{ + for (itemKey in clickKey) { + dynamicIClickArea.put(itemKey, object : IClickAreaListener { override fun onResponseArea(key: String, x0: Int, y0: Int, x1: Int, y1: Int) { mClickMap.let { - if(it.get(key) == null){ - it.put(key, intArrayOf(x0,y0,x1,y1)) - }else{ + if (it.get(key) == null) { + it.put(key, intArrayOf(x0, y0, x1, y1)) + } else { it.get(key)?.let { it[0] = x0 it[1] = y0 @@ -120,12 +119,12 @@ class SVGADynamicEntity { } fun setClickArea(clickKey: String) { - dynamicIClickArea.put(clickKey,object : IClickAreaListener{ + dynamicIClickArea.put(clickKey, object : IClickAreaListener { override fun onResponseArea(key: String, x0: Int, y0: Int, x1: Int, y1: Int) { mClickMap.let { - if(it.get(key) == null){ - it.put(key, intArrayOf(x0,y0,x1,y1)) - }else{ + if (it.get(key) == null) { + it.put(key, intArrayOf(x0, y0, x1, y1)) + } else { it.get(key)?.let { it[0] = x0 it[1] = y0 @@ -138,24 +137,25 @@ class SVGADynamicEntity { }) - fun setDynamicDrawerSized(drawer: (canvas: Canvas, frameIndex: Int, width: Int, height: Int) -> Boolean, forKey: String) { - this.dynamicDrawerSized.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() - this.dynamicImage.clear() - this.dynamicText.clear() - this.dynamicTextPaint.clear() - this.dynamicStaticLayoutText.clear() - this.dynamicBoringLayoutText.clear() - this.dynamicDrawer.clear() - this.dynamicIClickArea.clear() - this.mClickMap.clear() - this.dynamicDrawerSized.clear() + fun clearDynamicObjects() { + this.isTextDirty = true + this.dynamicHidden.clear() + this.dynamicImage.clear() + this.dynamicText.clear() + this.dynamicTextPaint.clear() + this.dynamicStaticLayoutText.clear() + this.dynamicBoringLayoutText.clear() + this.dynamicDrawer.clear() + this.dynamicIClickArea.clear() + this.mClickMap.clear() + this.dynamicDrawerSized.clear() - } + } + } } \ No newline at end of file diff --git a/library/src/main/java/com/opensource/svgaplayer/SVGARVImageView.kt b/library/src/main/java/com/opensource/svgaplayer/SVGARVImageView.kt new file mode 100644 index 00000000..e523e154 --- /dev/null +++ b/library/src/main/java/com/opensource/svgaplayer/SVGARVImageView.kt @@ -0,0 +1,28 @@ +package com.opensource.svgaplayer + +import android.content.Context +import android.util.AttributeSet + +/** + * Created by miaojun on 2020-01-08. + * mail:1290846731@qq.com + */ +class SVGARVImageView : SVGAImageView { + var isNeedResume = true + + constructor(context: Context?) : super(context) + + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if(isNeedResume && drawable != null){ + startAnimation() + } + } + +} \ No newline at end of file