ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpineRuntime-Presentation - 基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画

2021-01-27 19:32:52  阅读:294  来源: 互联网

标签:动画 Int String spine 创建 libgdx SpineRuntime Spine fun


SpineRuntime-Presentation

基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画


Github地址


效果

  • 可以在 Android 的 Presentation 页面上通过 GLSurfaceView 展示 Spine 动画,Spine 动画可以叠加,互不干扰
  • 使用PUSurfaceView替代PopupWindow在 Spine 动画的 GLSurfaceView 上层展示其他 View

演示gif

注意

  1. Presentation 需要 android.permission.SYSTEM_ALERT_WINDOWandroid.permission.WRITE_SETTINGS 两个权限
  2. 虚拟机运行可能报错
  3. Spine动画的缩放适配可能需要手动修改SpineBaseAdapter,现有的适配需要动画的中心在(0,-1)
  4. Spine 动画需要参照 Demo 通过回调依次创建
  5. Spine 动画的回调不是主线程,操作 view 需要异步到主线程
  6. 新创建的 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

  1. 优化 PUSurfaceView
  2. 优化 Spine 动画的缩放适配
  3. 优化 Spine 动画的动态 View 创建,不再需要提前在 container 上定义宽高

标签:动画,Int,String,spine,创建,libgdx,SpineRuntime,Spine,fun
来源: https://www.cnblogs.com/maiiiii/p/14336587.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有