Android Google Maps v2上的动画透明圆动画设置不正确

Android Google Maps v2上的动画透明圆动画设置不正确,android,android-animation,google-maps-android-api-2,Android,Android Animation,Google Maps Android Api 2,我能够在Android Google Maps v2上制作一个基本圆圈的动画,但我想向前迈出一步。 我希望动画圈与Tinders动画圈相似,这可能吗 例如: 现在,我得到一个烦躁的动画,这是非常不可接受的。这是我的密码: public void onMapReady(谷歌地图){ 双纬度=33.750587; 双经度=-84.4199173; LatLng LatLng=新LatLng(纬度、经度); 地图移动摄像机(CameraUpdateFactory.newLatLng(latLng))

我能够在Android Google Maps v2上制作一个基本圆圈的动画,但我想向前迈出一步。 我希望动画圈与Tinders动画圈相似,这可能吗

例如:

现在,我得到一个烦躁的动画,这是非常不可接受的。这是我的密码:

public void onMapReady(谷歌地图){
双纬度=33.750587;
双经度=-84.4199173;
LatLng LatLng=新LatLng(纬度、经度);
地图移动摄像机(CameraUpdateFactory.newLatLng(latLng));
map.animateCamera(CameraUpdateFactory.zoomTo(13));
addMarker(新的MarkerOptions()
.位置(新车床(纬度、经度))
。名称(“标记”);
最后一个圆圈=mMap.addCircle(新圆圈选项()
.中心(新板条(纬度、经度))
.半径(50).填充颜色(0x5500ff00).笔划宽度(0)
);
ValueAnimator ValueAnimator=新的ValueAnimator();
valueAnimator.setRepeatCount(valueAnimator.INFINITE);
valueAnimator.setRepeatMode(valueAnimator.RESTART);
valueAnimator.setIntValues(01100);
值Animator.setDuration(1000);
valueAnimator.setEvaluator(新的inteEvaluator());
valueAnimator.setInterpolator(新的AccelerateDelateInterpolator());
valueAnimator.addUpdateListener(新的valueAnimator.AnimatorUpdateListener(){
@凌驾
动画更新上的公共无效(ValueAnimator ValueAnimator){
float animatedFraction=valueAnimator.getAnimatedFraction();
Log.e(“,”+动画分数);
圆。设置半径(动画分数*100);
}
});

valueAnimator.start();
显然,如果使用正确,有两个github库可用于在标记上创建此连锁反应:


烦躁不安的动画是一个。要解决这个问题,可以使用a而不是圆圈

下面是一个获得您提到的效果的示例:

private static final int DURATION = 3000;
private void showRipples(LatLng latLng) {
    GradientDrawable d = new GradientDrawable();
    d.setShape(GradientDrawable.OVAL);
    d.setSize(500,500);
    d.setColor(0x5500ff00);
    d.setStroke(0, 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 = 50;

    // Add the circle to the map
    final GroundOverlay circle = map.addGroundOverlay(new GroundOverlayOptions()
            .position(latLng, 2 * radius).image(BitmapDescriptorFactory.fromBitmap(bitmap)));

    // Prep the animator   
    PropertyValuesHolder radiusHolder = PropertyValuesHolder.ofFloat("radius", 0, radius);
    PropertyValuesHolder transparencyHolder = PropertyValuesHolder.ofFloat("transparency", 0, 1);

    ValueAnimator valueAnimator = new ValueAnimator();
    valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
    valueAnimator.setRepeatMode(ValueAnimator.RESTART);
    valueAnimator.setValues(radiusHolder, transparencyHolder);
    valueAnimator.setDuration(DURATION);
    valueAnimator.setEvaluator(new FloatEvaluator());
    valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float animatedRadius = (float) valueAnimator.getAnimatedValue("radius");
            float animatedAlpha = (float) valueAnimator.getAnimatedValue("transparency");
            circle.setDimensions(animatedRadius * 2);
            circle.setTransparency(animatedAlpha);
        }
    });

    // start the animation
    valueAnimator.start();
}
现在来看连锁反应:

showRipples(latLng);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            showRipples(latLng);
        }
    }, DURATION - 500);
更新:本期

Im使用:

只是:

简单的家伙

首先,你需要在类外设置覆盖对象和半径对象

 GroundOverlay circle;
 int radius = 100000;
然后创建valueanimator对象并启动它

 final 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());
然后使用以下代码显示animatino

circle = mMap.addGroundOverlay(new GroundOverlayOptions()
                        .position(marker.getPosition(), 2 * radius).image(BitmapDescriptorFactory.fromBitmap(drawcircle())));



                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float animatedFraction = valueAnimator.getAnimatedFraction();
                        circle.setDimensions(animatedFraction * radius * 2);
                    }
                });

                valueAnimator.start();

根据neha小姐的问题

是的,这可以和马克一起使用

只需按照上面的答案进行操作即可

将动画代码写入OnMarkerClick事件


你最终是如何将这些库用于谷歌地图标记的?你知道如何将其用于谷歌地图标记吗?@Neeraj:这是可行的,但当我放大地图时,涟漪动画的大小也会增加。你知道如何保持大小不变吗?thanks@Neha由于问题已经解决,因此无需再使用此解决方法。您可以现在可以开始添加
Circle
s,而不会出现闪烁问题。@Neeraj:我尝试过使用Circle,但当我放大和缩小地图时,它会缩小和扩大。我希望大小保持不变same@Neeraj这是我面临的问题@Neha我想你在寻找类似的东西?你可能需要在answ中重新计算呃。
circle = mMap.addGroundOverlay(new GroundOverlayOptions()
                        .position(marker.getPosition(), 2 * radius).image(BitmapDescriptorFactory.fromBitmap(drawcircle())));



                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float animatedFraction = valueAnimator.getAnimatedFraction();
                        circle.setDimensions(animatedFraction * radius * 2);
                    }
                });

                valueAnimator.start();
 if(circle!=null)
                {
                    circle.remove();
                }


                circle = mMap.addGroundOverlay(new GroundOverlayOptions()
                        .position(marker.getPosition(), 2 * radius).image(BitmapDescriptorFactory.fromBitmap(drawcircle())));



                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float animatedFraction = valueAnimator.getAnimatedFraction();
                        circle.setDimensions(animatedFraction * radius * 2);
                    }
                });

                valueAnimator.start();