android 中谷歌地图上的圆圈动画

问题描述 投票:0回答:2

使用值动画在谷歌地图上做圆形动画,但动画一直闪烁。

这是代码,

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

任何人都可以帮助我使其动画流畅而不闪烁..

谢谢

android google-maps animation
2个回答
6
投票

这是一个已知问题。一种解决方法是使用 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();

更新:此问题已修复


0
投票

尽管 Google 声称问题已得到解决,但我可以确认,截至今天,无论是通过 android-maps-compose 还是通过 vanilla 地图 api 添加的任何 Circle 原语对于动画的优化都很差,导致大量丢帧和整体“应用程序“口吃”,即使它几乎没有任何 UI(换句话说,如果你像我一样使用 Jetpack Compose,口吃不太可能是由重组引起的)。

使用 GroundOverlay 而不是 Circle 为我解决了这个问题,尽管我本来希望更平滑。令我惊讶的是,官方 Google 地图应用程序(黄油般平滑的动画)和糟糕的 Google 地图 API 的功能之间存在着如此巨大的差距,当点击它时,甚至无法返回兴趣点的 LatLng(它会返回水龙头的纬度与他们的文档所说的相反)。

© www.soinside.com 2019 - 2024. All rights reserved.