使用值动画在谷歌地图上做圆形动画,但动画一直闪烁。
这是代码,
CircleOptions circleOptions = new CircleOptions()
.center(searchStopPoint) //set center
.radius(100) //set radius in meters
.strokeColor(Color.TRANSPARENT)
.fillColor(0x555751FF)
.strokeWidth(5);
busStopCircle = googleMap.addCircle(circleOptions);
ValueAnimator valueAnimator = new ValueAnimator();
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
valueAnimator.setIntValues(0, 100);
valueAnimator.setDuration(3000);
valueAnimator.setEvaluator(new IntEvaluator());
valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float animatedFraction = valueAnimator.getAnimatedFraction();
busStopCircle.setRadius(animatedFraction * 100);
}
});
valueAnimator.start();
任何人都可以帮助我使其动画流畅而不闪烁..
谢谢
这是一个已知问题。一种解决方法是使用 GroundOverlay 而不是圆圈。
这是一个示例:
创建圆圈:
// The drawable to use for the circle
GradientDrawable d = new GradientDrawable();
d.setShape(GradientDrawable.OVAL);
d.setSize(500,500);
d.setColor(0x555751FF);
d.setStroke(5, Color.TRANSPARENT);
Bitmap bitmap = Bitmap.createBitmap(d.getIntrinsicWidth()
, d.getIntrinsicHeight()
, Bitmap.Config.ARGB_8888);
// Convert the drawable to bitmap
Canvas canvas = new Canvas(bitmap);
d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
d.draw(canvas);
// Radius of the circle
final int radius = 100;
// Add the circle to the map
final GroundOverlay circle = map.addGroundOverlay(new GroundOverlayOptions()
.position(searchStopPoint, 2 * radius).image(BitmapDescriptorFactory.fromBitmap(bitmap)));
现在为圆形叠加层设置动画:
ValueAnimator valueAnimator = new ValueAnimator();
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
valueAnimator.setIntValues(0, radius);
valueAnimator.setDuration(3000);
valueAnimator.setEvaluator(new IntEvaluator());
valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float animatedFraction = valueAnimator.getAnimatedFraction();
circle.setDimensions(animatedFraction * radius * 2);
}
});
valueAnimator.start();
更新:此问题已修复
尽管 Google 声称问题已得到解决,但我可以确认,截至今天,无论是通过 android-maps-compose 还是通过 vanilla 地图 api 添加的任何 Circle 原语对于动画的优化都很差,导致大量丢帧和整体“应用程序“口吃”,即使它几乎没有任何 UI(换句话说,如果你像我一样使用 Jetpack Compose,口吃不太可能是由重组引起的)。
使用 GroundOverlay 而不是 Circle 为我解决了这个问题,尽管我本来希望更平滑。令我惊讶的是,官方 Google 地图应用程序(黄油般平滑的动画)和糟糕的 Google 地图 API 的功能之间存在着如此巨大的差距,当点击它时,甚至无法返回兴趣点的 LatLng(它会返回水龙头的纬度与他们的文档所说的相反)。