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

Android API17下Marker动画如何替代FrameMetrics.ANIMATION_DURATION值

解决API17下无法使用FrameMetrics.ANIMATION_DURATION的问题

很简单,你只需要手动定义一个和FrameMetrics.ANIMATION_DURATION等效的常量值就可以了。因为这个系统常量在API24及以上的实际值是16毫秒(对应60fps的单帧理想耗时),完全可以自己在代码里硬编码这个值,或者定义一个自定义常量来替代。

具体修改步骤:

  1. 在你的类中添加一个自定义常量,替代高版本的系统常量:
// 自定义等效于FrameMetrics.ANIMATION_DURATION的常量,适配API17
private static final long ANIMATION_DURATION = 16L;
  1. 直接在动画代码中使用这个自定义常量即可,无需依赖高版本API:
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static void animateMarkerToICS(Marker marker, LatLng finalPosition, final LatLngInterpolator latLngInterpolator) {
    TypeEvaluator<LatLng> typeEvaluator = new TypeEvaluator<LatLng>() {
        @Override
        public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) {
            return latLngInterpolator.interpolate(fraction, startValue, endValue);
        }
    };
    Property<Marker, LatLng> property = Property.of(Marker.class, LatLng.class, "position");
    // 若已在向旧位置执行动画则停止
    if(animator != null && animator.isRunning()) {
        animator.cancel();
        animator = null;
    }
    animator = ObjectAnimator.ofObject(marker, property, typeEvaluator, finalPosition);
    // 使用自定义常量替代API24的FrameMetrics.ANIMATION_DURATION
    animator.setDuration(ANIMATION_DURATION);
    animator.start();
}

补充说明:

如果你其实是想要设置动画的总时长(比如几百毫秒,而非单帧耗时),那可能是混淆了FrameMetrics.ANIMATION_DURATION的用途——这个常量是用来衡量单帧动画的理想耗时,并非动画的总运行时间。这种情况下,你可以根据需求自定义合适的时长,比如300L(300毫秒),能让标记移动的动画更平滑自然。

内容的提问来源于stack exchange,提问作者alejandro perez banegas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:06:51