You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

关键修改点说明

  1. 实现Drawable.Callback接口:

    • invalidateDrawable:当Lottie需要重绘时,调用postInvalidate()通知GraphicOverlay刷新当前Graphic。
    • scheduleDrawable/unscheduleDrawable:借助GraphicOverlay的Handler处理动画帧的定时调度,保证动画流畅运行。
  2. 设置LottieDrawable的绘制区域:
    原代码未指定bounds,导致动画默认尺寸为0,无法显示。通过计算屏幕中心区域设置绘制边界,确保动画可见。

  3. 修正构造方法:
    需接收GraphicOverlay参数并传递给父类构造,同时获取上下文和Handler资源。

内容的提问来源于stack exchange,提问作者srinidhi prasad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:35:28