Android Google Maps v2:动画标记大小

4
我正在尝试在添加到地图上的标记上实现大小动画,基本上我想让标记变大。我看不到任何获取标记实际视图的方法,所以我认为我不能使用标准的Android动画技术(例如ObjectAnimator)。
我唯一能想到的做法是实现自己的动画,并使用setIcon方法更改标记图标。
还有其他更好的方法吗?
我正在使用Xamarin,但必要时可以转换Java代码。

1
从技术上讲,您可以使用 ObjectAnimator,例如 "icon" 属性,前提是您的 target 对象中有 setIcon 方法,并创建如下:ObjectAnimator.ofInt(this,"icon",10,100) - pskink
@pskink 你说得对,这正是我最终采用的方法。请把你的评论发为答案,我会接受。 - Ian Newson
3个回答

8
你可以尝试像这样做:
final Marker marker = map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_temperature_kelvin_black_48dp);
final Bitmap target = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(target);
ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
animator.setDuration(500);
animator.setStartDelay(1000);
final Rect originalRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF scaledRect = new RectF();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float scale = (float) animation.getAnimatedValue();
        scaledRect.set(0, 0, originalRect.right * scale, originalRect.bottom * scale);
        canvas.drawBitmap(bitmap, originalRect, scaledRect, null);
        marker.setIcon(BitmapDescriptorFactory.fromBitmap(target));
    }
});
animator.start();

1

是的,你说得对,没有直接的方法可以做到这一点。相反,你可以使用处理程序,在大约每500毫秒后调用它,并在其中设置标记的setIcon。

使用此链接作为参考; 如何在Android地图API V2中动画化标记?


0

对于矢量图形

fun Drawable.getBitmapFromVectorDrawable(): Bitmap {
val bitmap = Bitmap.createBitmap(
    intrinsicWidth,
    intrinsicHeight, Bitmap.Config.ARGB_8888
)

val canvas = Canvas(bitmap)
setBounds(0, 0, canvas.width, canvas.height)
draw(canvas)

return bitmap

}

然后执行

val marker = map.addMarker(MarkerOptions().position(LatLng(latitude, longitude)))
            val bitmap = requireContext().requireDrawable(R.drawable.marker)!!
                .getBitmapFromVectorDrawable()
            ValueAnimator.ofInt(1, bitmap.width).apply {
                duration = resources.getInteger(R.integer.itr_normal_anim_time).toLong()
                interpolator = OvershootInterpolator()
                addUpdateListener { animation ->
                    val scale = animation.animatedValue as Int
                    val scaledBitmap = bitmap.scale(scale, scale)
                    marker!!.setIcon(BitmapDescriptorFactory.fromBitmap(scaledBitmap))
                }
                start()
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接