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”)在创建JSONObject并将其传递给Lottie之前,请在字符串上进行编码>。要应用颜色过滤器,目前需要三件事:
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) }
)