Android API17下Marker动画如何替代FrameMetrics.ANIMATION_DURATION值
解决API17下无法使用FrameMetrics.ANIMATION_DURATION的问题
很简单,你只需要手动定义一个和FrameMetrics.ANIMATION_DURATION等效的常量值就可以了。因为这个系统常量在API24及以上的实际值是16毫秒(对应60fps的单帧理想耗时),完全可以自己在代码里硬编码这个值,或者定义一个自定义常量来替代。
具体修改步骤:
- 在你的类中添加一个自定义常量,替代高版本的系统常量:
// 自定义等效于FrameMetrics.ANIMATION_DURATION的常量,适配API17 private static final long ANIMATION_DURATION = 16L;
- 直接在动画代码中使用这个自定义常量即可,无需依赖高版本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
相关产品推荐
相关产品推荐

