是否可以以编程方式重新着色彩票动画?

问题描述

如果我有一个 json 文件形式的 lottie 动画,有没有办法在代码中甚至在 json 本身中重新着色它?

(明确地说,我希望有一种方法可以在不涉及 After Effects 的情况下做到这一点。例如,如果我决定更改应用程序的主要颜色,则整个应用程序都会更改,除了动画之外,除非有办法做到这一点。)

解决方法

我想通了。在此示例中,假设我要将特定图层重新着色为 Color.RED。

您需要 LottieAnimationView、KeyPath 和 LottieValueCallback

private LottieAnimationView lottieAnimationVIew;
private KeyPath mKeyPath;
private LottieValueCallback<Integer> mCallback;

然后在您的 onCreate(或 onViewCreated 对于片段)中,您将获得带有 findViewById 的动画,以及“addLottieOnCompositionLoadedListener”到 lottieAnimationView,您将在其中设置“mKeyPath”和“mCallback”:

lottieAnimationVIew = findViewById(R.id.animationView);

lottieAnimationView.addLottieOnCompositionLoadedListener(new LottieOnCompositionLoadedListener() {
  @Override
  public void onCompositionLoaded(LottieComposition composition) {
    mKeyPath = getKeyPath(); // This is your own method for getting the KeyPath you desire. More on that below.
    mCallback = new LottieValueCallback<>();
    mCallback.setValue(Color.RED);
    checkBox.addValueCallback(mKeyPath,LottieProperty.COLOR,mCallback);
  }
});

参数“LottieProperty.COLOR”指定我要更改的属性。

可能有更好的方法来做到这一点,但这是我的“getKeyPath”方法,用于查找我想要更改的特定内容。它会记录每一个 KeyPath,这样你就可以看到你想要的是哪一个。一旦您提供了正确的索引,它就会返回它。我看到我想要的是列表中的第 5 个,因此硬编码索引为 4。

private KeyPath getKeyPath() {
  List<KeyPath> keyPaths = lottieAnimationView.resolveKeyPath(new KeyPath("Fill","Ellipse 1","Fill 1"));
        
  for (int i = 0; i < keyPaths.size(); i++) {
    Log.i("KeyPath",keyPaths.get(i).toString());
  }
        
  if (keyPaths.size() == 5) {
    return keyPaths.get(4);
  }
  else {
    return null;
  }
}

请注意,“Fill”、“Ellipse 1”、“Fill 1”是我提供的字符串,用于将列表缩小到具有这些键的那些,因为我知道我想要的层将在其中。也可能有更好的方法来做到这一点。