package com.airbnb.lottie; import android.graphics.Canvas; import android.graphics.Matrix; import android.support.annotation.FloatRange; import android.support.v4.util.LongSparseArray; import java.util.ArrayList; import java.util.List; class CompositionLayer extends BaseLayer { private final List<BaseLayer> layers = new ArrayList<>(); CompositionLayer(LottieDrawable lottieDrawable, Layer layerModel, List<Layer> layerModels, LottieComposition composition) { super(lottieDrawable, layerModel); LongSparseArray<BaseLayer> layerMap = new LongSparseArray<>(composition.getLayers().size()); BaseLayer mattedLayer = null; for (int i = layerModels.size() - 1; i >= 0; i--) { Layer lm = layerModels.get(i); BaseLayer layer = BaseLayer.forModel(lm, lottieDrawable, composition); layerMap.put(layer.getLayerModel().getId(), layer); if (mattedLayer != null) { mattedLayer.setMatteLayer(layer); mattedLayer = null; } else { layers.add(0, layer); switch (lm.getMatteType()) { case Add: case Invert: mattedLayer = layer; break; } } } for (int i = 0; i < layerMap.size(); i++) { long key = layerMap.keyAt(i); BaseLayer layerView = layerMap.get(key); BaseLayer parentLayer = layerMap.get(layerView.getLayerModel().getParentId()); if (parentLayer != null) { layerView.setParentLayer(parentLayer); } } } @Override void drawLayer(Canvas canvas, Matrix parentMatrix, int parentAlpha) { for (int i = layers.size() - 1; i >= 0 ; i--) { layers.get(i).draw(canvas, parentMatrix, parentAlpha); } } @Override public void setProgress(@FloatRange(from = 0f, to = 1f) float progress) { super.setProgress(progress); progress -= layerModel.getStartProgress(); for (int i = layers.size() - 1; i >= 0; i--) { layers.get(i).setProgress(progress); } } boolean hasMasks() { for (int i = layers.size() - 1; i >= 0; i--) { BaseLayer layer = layers.get(i); if (layer instanceof ShapeLayer) { if (layer.hasMasksOnThisLayer()) { return true; } } } return false; } boolean hasMatte() { if (hasMatteOnThisLayer()) { return true; } for (int i = layers.size() - 1; i >= 0; i--) { if (layers.get(i).hasMatteOnThisLayer()) { return true; } } return false; } }