Android 洛蒂·安卓:为动画添加色彩叠加

Android 洛蒂·安卓:为动画添加色彩叠加,android,animation,lottie-android,Android,Animation,Lottie Android,我正在使用在应用程序中添加一些动画。在这个应用程序中,主色和强调色可以通过设置来选择。我正在使用具有透明背景的动画。为了使动画适合所选的颜色,我想为动画添加一个颜色覆盖,这样我可以有一个动画文件,但我可以通过编程设置颜色 有人知道如何通过添加颜色覆盖来操纵动画吗 由于在设置动画时要将包含所有图形数据的JSONObject传递给Lottie,因此可以在设置之前用所需的颜色值替换一些颜色值 如果您查找颜色键c,您可能会发现 ,“c”:{“k”:[1,0.7,0,1]},“fillEnabled”:t

我正在使用在应用程序中添加一些动画。在这个应用程序中,主色和强调色可以通过设置来选择。我正在使用具有透明背景的动画。为了使动画适合所选的颜色,我想为动画添加一个颜色覆盖,这样我可以有一个动画文件,但我可以通过编程设置颜色


有人知道如何通过添加颜色覆盖来操纵动画吗

由于在设置动画时要将包含所有图形数据的JSONObject传递给Lottie,因此可以在设置之前用所需的颜色值替换一些颜色值

如果您查找颜色键
c
,您可能会发现

,“c”:{“k”:[1,0.7,0,1]},“fillEnabled”:true,。。。

在JSONArray中更改这些浮点值将更改动画中的颜色

诚然,我并不是说找到/替换正确的值太简单,但这至少应该为您指明方向


附带说明:一旦找到它,您可以将资产中的值设置为某种漂亮的占位符,如
“k”:[BG_COLOR_REPLACEMENT_1]
,然后在加载资产时,只需运行
.replace(“BG_COLOR_REPLACEMENT_1”,“1,0.7,1,1”)

要应用颜色过滤器,目前需要三件事:

  • KeyPath(要编辑的内容的名称)
  • LottieProperty(要编辑的属性名称)
  • LottieValueCallback(为每次动画重新渲染调用回调)
  • 层名称可以通过标记“nm”在动画的JSON中找到

    添加全彩色叠加:

    LottieAnimationView animationView = findViewById(R.id.animation_view);
    animationView.addValueCallback(
            new KeyPath("**"),
            LottieProperty.COLOR_FILTER,
            new SimpleLottieValueCallback<ColorFilter>() {
                @Override
                public ColorFilter getValue(LottieFrameInfo<ColorFilter> frameInfo) {
                    return new PorterDuffColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP);
                }
            }
    );
    
    lottieeanimationview animationView=findviewbyd(R.id.animation\u视图);
    animationView.addValueCallback(
    新密钥路径(“**”),
    LottieProperty.COLOR\u过滤器,
    新的SimpleLottieValueCallback(){
    @凌驾
    公共颜色过滤器getValue(LottieFrameInfo frameInfo){
    返回新的PorterDuffColorFilter(Color.GREEN、PorterDuff.Mode.SRC_);
    }
    }
    );
    
    添加单层颜色叠加(称为“选中标记”的层):

    lottieeanimationview animationView=findviewbyd(R.id.animation\u视图);
    animationView.addValueCallback(
    新密钥路径(“选中标记“,”**”),
    LottieProperty.COLOR\u过滤器,
    新的SimpleLottieValueCallback(){
    @凌驾
    公共颜色过滤器getValue(LottieFrameInfo frameInfo){
    返回新的PorterDuffColorFilter(Color.CYAN、PorterDuff.Mode.SRC_);
    }
    }
    );
    
    删除任何颜色覆盖:

    LottieAnimationView animationView = findViewById(R.id.animation_view);
    animationView.addValueCallback(new KeyPath("**"), LottieProperty.COLOR_FILTER,
            new SimpleLottieValueCallback<ColorFilter>() {
                @Override
                public ColorFilter getValue(LottieFrameInfo<ColorFilter> frameInfo) {
                    return null;
                }
            }
    );
    
    lottieeanimationview animationView=findviewbyd(R.id.animation\u视图);
    animationView.addValueCallback(新键路径(“**”),LottieProperty.COLOR\u过滤器,
    新的SimpleLottieValueCallback(){
    @凌驾
    公共颜色过滤器getValue(LottieFrameInfo frameInfo){
    返回null;
    }
    }
    );
    
    你可以在这本书里读到这一切

    你也可以看看这个

    下面是代码片段结果的可视化视图:


    我看到了瓜达尼的回答,并详细阐述了一种安全的方法来查找包含乐蒂动画的JSON中的颜色:

    搜索-“c”:{“a”-你会在图像的每一层找到类似这样的片段:{“ty”:“fl”,“c”:{“a”:0,k:[0.4,0.4,0.4]}


    在片段中,您会注意到“c”表示颜色,“a”表示ALPHA,“k”表示图层颜色的CMYK。只需将其更改为您想要的颜色。

    根据主要答案,可在乐蒂的来源中找到(谢谢)

    JAVA 首先,获取您的颜色,例如:

    int yourColor=ContextCompat.getColor(getContext(),R.color.colorPrimary);
    
    然后按如下方式设置颜色过滤器:

    SimpleColor过滤器=新的SimpleColor过滤器(yourColor);
    KeyPath KeyPath=新的KeyPath(“**”);
    LottieValueCallback callback=新的LottieValueCallback(过滤器);
    animationView.addValueCallback(keyPath,LottieProperty.COLOR\u过滤器,回调);
    
    科特林 首先,获取您的颜色,例如:

    val yourColor=ContextCompat.getColor(context,R.color.colorPrimary)
    
    然后按如下方式设置颜色过滤器:

    val filter=SimpleColor过滤器(yourColor)
    val keyPath=keyPath(“**”)
    val回调:LottieValueCallback=LottieValueCallback(过滤器)
    animationView.addValueCallback(关键路径、LottieProperty.COLOR\u过滤器、回调)
    
    科特林扩建
    fun LottieAnimationView.changeLayersColor(
    @ColorRes ColorRes:Int
    ) {
    val color=ContextCompat.getColor(context,colorRes)
    val过滤器=SimpleColor过滤器(颜色)
    val keyPath=keyPath(“**”)
    val回调:LottieValueCallback=LottieValueCallback(过滤器)
    addValueCallback(键路径,LottieProperty.COLOR\u过滤器,回调)
    }
    
    如果JSON有一个
    sc:
    字段,那么您应该能够直接设置十六进制颜色

    比如:

    在Kotlin(v1.4.32)中,要在所有层中设置完整动画,只需执行以下操作:

    YOURS_LottieAnimationView.addValueCallback(
                KeyPath("**"),
                LottieProperty.COLOR_FILTER,
                { PorterDuffColorFilter(Color.parseColor("#b70101"), PorterDuff.Mode.SRC_ATOP) }
            )
    

    使用app:lottie_colorFilter=“@color/colorancent”,如果您想通过未在lottie中定义的xmladdColorFilter进行访问。请检查是否可以覆盖“官方文档”的渐变色而不是纯色?链接是死的。这是它的存档版本:。可能有更新的链接?@androiddeveloper我特意创建了一个示例存储库,展示了Lottie 3.0.0的实现。我也更新了答案。给你:请注意JSONObject是一个无序的映射概念,那些
    a
    k
    keys在您的搜索中可能不会按字母顺序显示。空格和换行符也可能是漂亮打印的结果,因此您可能希望在搜索和使用正则表达式之前对其进行规范化
    "sc": "#6664e7"
    
    YOURS_LottieAnimationView.addValueCallback(
                KeyPath("**"),
                LottieProperty.COLOR_FILTER,
                { PorterDuffColorFilter(Color.parseColor("#b70101"), PorterDuff.Mode.SRC_ATOP) }
            )