【问题标题】:Is it possible to recolor a lottie animation programmatically?是否可以以编程方式重新着色乐透动画?
【发布时间】:2021-01-10 22:19:33
【问题描述】:

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

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

【问题讨论】:

    标签: android-studio lottie


    【解决方案1】:

    我想通了。对于此示例,假设我想将特定图层重新着色为 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”是我提供的字符串,用于将列表缩小到具有这些键的那些,因为我知道我想要的图层将在其中。也可能有更好的方法来做到这一点。

    【讨论】:

      【解决方案2】:

      关于这个主题还有另一个线程使用相同的方法但有点简化: How to add a color overlay to an animation in Lottie?

      这里直接举个例子(Kotlin):

              yourLottieAnimation.addValueCallback(
              KeyPath("whatever_keypath", "**"),
              LottieProperty.COLOR_FILTER
          ) {
              PorterDuffColorFilter(
                  Color.CYAN,
                  PorterDuff.Mode.SRC_ATOP
              )
          }
      

      您也可以在 Lottie 编辑器中找到键路径的名称。

      【讨论】:

        猜你喜欢
        • 2014-04-01
        • 2011-05-30
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多