SpineRuntime-Presentation - 基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画
SpineRuntime-Presentation
基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画
Github地址
效果
- 可以在 Android 的 Presentation 页面上通过 GLSurfaceView 展示 Spine 动画,Spine 动画可以叠加,互不干扰
 - 使用
PUSurfaceView替代PopupWindow在 Spine 动画的 GLSurfaceView 上层展示其他 View 
注意
- Presentation 需要 
android.permission.SYSTEM_ALERT_WINDOW、android.permission.WRITE_SETTINGS两个权限 - 虚拟机运行可能报错
 - Spine动画的缩放适配可能需要手动修改
SpineBaseAdapter,现有的适配需要动画的中心在(0,-1) - Spine 动画需要参照 Demo 通过回调依次创建
 - Spine 动画的回调不是主线程,操作 view 需要异步到主线程
 - 新创建的 Spine 动画 View 的 zOrder 始终为 top
 
使用
调用请参考 app module 的 SpinePresentation.kt
1. 加载GDX
    companion object {
        init {
            GdxNativesLoader.load()
        }
    }
2. 创建Adapter
创建自定义 adapter 继承 SpineBaseAdapter,在onCreateImpl()回调中设置动画数据,在onCreatedImpl()中设置 skim 与 animation,也可以在创建 adapter 后设置。
    abstract class SpineBaseAdapter : ApplicationAdapter {
        var tag = "null"    // 用于onCreated异步回调的tag
        var skinName = "default"          // 默认皮肤名称
        var animationName = "animation"   // 默认动画名称
        var debugMode = false               // 默认关闭debug
        var isClickable = true              // view是否可被点击,默认为true
        constructor(padding: Int = 0)
        constructor(paddingStart: Int, paddingTop: Int, paddingEnd: Int, paddingBottom: Int)
        /**
        * 动画的点击回调
        */
        fun setOnSpineClickListener(spineClickListener: OnSpineClickListener)
        /**
        * 动画的创建完成回调
        * 多个Spine动画对象需要依次创建,不可以同时创建多个
        * 多以需要设置创建完成的异步回调,并配合tag来进行判断
        */
        fun setOnCreatedListener(onSpineCreatedListener: OnSpineCreatedListener)
        /**
        * 根据altasPath与skeletonPath初始化之后的回调
        * 用于setSkin、setAnimation、setAttachment
        */
        abstract fun onCreatedImpl()
        /**
        * 点击事件回调
        */
        abstract fun doClick()
        /**
        * 设置Spine的Altas路径
        * @param path 路径
        * @param fileType [FileType]
        */
        fun setAltasPath(path: String, fileType: FileType)
        /**
        * 设置Spine的json文件路径
        */
        fun setSkeletonPath(path: String, fileType: FileType)
        /**
        * 设置动画
        */
        fun setAnimation(trackIndex: Int, animationName: String, loop: Boolean)
        /**
        * 实例开始创建回调
        * 在这里设置Altas与SkeletonPath
        */
        abstract fun onCreateImpl()
        /**
        * 换装饰
        *
        * @param slotName       插槽名称
        * @param attachmentName 装饰名称
        * @return
        */
        fun setAttachment(slotName: String, attachmentName: String): Boolean
        /**
        * 换肤
        *
        * @param skinName 皮肤名称
        * @return
        */
        fun setSkin(skinName: String): Boolean
        /**
        * 创建完成的回调
        */
        interface OnSpineCreatedListener {
            fun onCreated(tag: String)
        }
        /**
        * 创建 SurfaceView 对象
        */
        @Synchronized
        fun create(activity: Activity): View
    }
3. 创建 view 与展示
调用 adapter 的create(activity: Activity)方法创建 view,并将 view 添加到 parentView 中。
4. 在 Spine 上层绘制纯色与图片
使用PUSurfaceView可以在 Spine 动画上层绘制纯色与图片。PUSurfaceView仅实现了简单的SurfaceView绘制功能。
    <!-- drawType 为 color 时需要配置 bgColor,image 时需要配置 imageSrc -->
    <com.mai.spine.PUSurfaceView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:bgColor="#88000000"
            app:imageSrc="@mipmap/ic_launcher"
            app:drawType="<!-- color / image --> " />
5. 动态创建 PUSurfaceView
    class PUSurfaceView : SurfaceView{
        constructor(context: Context, attrs: AttributeSet?)
        constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
        constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int)
        /**
         * 根据传入的color绘制纯色
         */
        fun drawColor(color: Int)
        /**
         * 根据传入id绘制图片
         */
        fun drawImage(id: Int)
    }
TODO
- 优化 PUSurfaceView
 - 优化 Spine 动画的缩放适配
 - 优化 Spine 动画的动态 View 创建,不再需要提前在 container 上定义宽高
 
SpineRuntime-Presentation - 基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画的更多相关文章
- 基于 Flink 的实时数仓生产实践
		
数据仓库的建设是“数据智能”必不可少的一环,也是大规模数据应用中必然面临的挑战.在智能商业中,数据的结果代表了用户反馈.获取数据的及时性尤为重要.快速获取数据反馈能够帮助公司更快地做出决策,更好地进行 ...
 - 基于 Kafka 的实时数仓在搜索的实践应用
		
一.概述 Apache Kafka 发展至今,已经是一个很成熟的消息队列组件了,也是大数据生态圈中不可或缺的一员.Apache Kafka 社区非常的活跃,通过社区成员不断的贡献代码和迭代项目,使得 ...
 - 利用Mahout实现在Hadoop上运行K-Means算法
		
利用Mahout实现在Hadoop上运行K-Means算法 一.介绍Mahout Mahout是Apache下的开源机器学习软件包,目前实现的机器学习算法主要包含有协同过滤/推荐引擎,聚类和分类三个部 ...
 - 基于原生JS封装数组原型上的sort方法
		
基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...
 - 基于Caffe的DeepID2实现(上)
		
小喵的唠叨话:小喵最近在做人脸识别的工作,打算将汤晓鸥前辈的DeepID,DeepID2等算法进行实验和复现.DeepID的方法最简单,而DeepID2的实现却略微复杂,并且互联网上也没有比较好的资源 ...
 - Resumable.js – 基于 HTML5 File API 的文件上传
		
Resumable.js 是一个 JavaScript 库,通过 HTML5 文件 API 提供,稳定和可恢复的批量上传功能.在上传大文件的时候通过每个文件分割成小块,每块在上传失败的时候,上传会不断 ...
 - 基于h5的图片无刷新上传(uploadifive)
		
基于h5的图片无刷新上传(uploadifive) uploadifive简介 了解uploadify之前,首先了解来一下什么是uploadify,uploadfy官网,uploadify和uploa ...
 - 注意padding-top 百分比定义基于父元素宽度的百分比上内边距!!是基于宽度
		
定义和用法 padding-top 属性设置元素的上内边距(空间). 说明 该属性设置元素上内边距的宽度.行内非替换元素上设置的上内边距不会影响行高计算,因此,如果一个元素既有内边距又有背景,从视觉上 ...
 - 基于 Django的Ajax实现  文件上传
		
---------------------------------------------------------------遇到困难的时候,勇敢一点,找同学朋友帮忙,找导师求助. Ajax Ajax ...
 
随机推荐
- POJ2932 Coneology【圆扫描线】
			
POJ2932 Coneology 题意: 给出一些不相交的圆,问有多少个圆不被其他圆包围 题解: 扫描线,把所有圆的左边界和右边界放到\(vector\)里排序,遍历到圆左边界的时候判断是否满足条件 ...
 - Codeforces Round #652 (Div. 2) D. TediousLee(dp)
			
题目链接:https://codeforces.com/contest/1369/problem/D 题意 最初有一个结点,衍生规则如下: 如果结点 $u$ 没有子结点,添加 $1$ 个子结点 如果结 ...
 - Educational Codeforces Round 88 (Rated for Div. 2)  E、Modular Stability  逆元+思维
			
题目链接:E.Modular Stability 题意: 给你一个n数,一个k,在1,2,3...n里挑选k个数,使得对于任意非负整数x,对于这k个数的任何排列顺序,然后用x对这个排列一次取模,如果最 ...
 - Codeforces Round #652 (Div. 2) C. RationalLee  贪心
			
题意: t组输入,你有n个数,还有k个朋友,每一个朋友需要wi个数.意思就是你要给第i个朋友分配wi个数,输入保证w1+w2+...+wk=n 一个朋友的兴奋值是你分配给他的数中最大值加上最小值的和( ...
 - hdu5550 Game Rooms
			
Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submission ...
 - 4.Redis客户端的使用
			
标题 : 4.Redis客户端的使用 目录 : Redis 序号 : 4 Console.WriteLine($"北京和天津之间的距离是:{distance}公里"); #### ...
 - C++11特性-右值引用
			
什么是左值,什么是右值 常见的误区有 = 左边的是左值,右边的是右值. 左值:具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables) ...
 - select函数详细用法解析
			
1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set ...
 - SPN在域环境中的应用
			
0X01 SPN 服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称.Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联.如果 ...
 - element-ui select get selected option object
			
element-ui select get selected option object value-key="value" === String :value="{va ...
 
			
		