LottieDrawable在GraphicOverlay.Graphic中无法播放动画的问题求助
解决LottieDrawable在GraphicOverlay.Graphic子类中无法播放的问题
问题核心在于LottieDrawable需要通过Drawable.Callback接口触发视图重绘,而GraphicOverlay.Graphic默认未实现该接口。你需要让PoseGraphic实现Drawable.Callback,并将回调指向当前实例,同时利用GraphicOverlay的调度能力处理动画帧更新。
修改后的完整代码
public class PoseGraphic extends GraphicOverlay.Graphic implements Drawable.Callback { private final GraphicOverlay overlay; private LottieDrawable mLottieDrawable; public PoseGraphic(GraphicOverlay overlay) { super(overlay); this.overlay = overlay; initLottie(); } private void initLottie() { mLottieDrawable = new LottieDrawable(); mLottieDrawable.enableMergePathsForKitKatAndAbove(true); // 同步加载动画资源 LottieResult<LottieComposition> result = LottieCompositionFactory.fromRawResSync(getContext(), R.raw.heart); if (result.getValue() != null) { mLottieDrawable.setComposition(result.getValue()); mLottieDrawable.setRepeatCount(LottieDrawable.INFINITE); // 设置回调为当前实现的Drawable.Callback接口 mLottieDrawable.setCallback(this); mLottieDrawable.start(); } } @Override public void draw(Canvas canvas) { // 必须设置LottieDrawable的绘制区域,否则无法显示 int centerX = overlay.getWidth() / 2; int centerY = overlay.getHeight() / 2; int size = Math.min(overlay.getWidth(), overlay.getHeight()) / 2; mLottieDrawable.setBounds(centerX - size/2, centerY - size/2, centerX + size/2, centerY + size/2); mLottieDrawable.draw(canvas); } // 实现Drawable.Callback的三个方法 @Override public void invalidateDrawable(@NonNull Drawable who) { // 通知GraphicOverlay重绘当前Graphic postInvalidate(); } @Override public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) { // 利用GraphicOverlay的Handler调度动画帧任务 overlay.getHandler().postAtTime(what, who, when); } @Override public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what) { // 取消已调度的动画帧任务 overlay.getHandler().removeCallbacks(what, who); } }
关键修改点说明
实现
Drawable.Callback接口:invalidateDrawable:当Lottie需要重绘时,调用postInvalidate()通知GraphicOverlay刷新当前Graphic。scheduleDrawable/unscheduleDrawable:借助GraphicOverlay的Handler处理动画帧的定时调度,保证动画流畅运行。
设置LottieDrawable的绘制区域:
原代码未指定bounds,导致动画默认尺寸为0,无法显示。通过计算屏幕中心区域设置绘制边界,确保动画可见。修正构造方法:
需接收GraphicOverlay参数并传递给父类构造,同时获取上下文和Handler资源。
内容的提问来源于stack exchange,提问作者srinidhi prasad
相关产品推荐
相关产品推荐

