如何为 google 地图上的标记设置动画?
How to animate marker on google maps ?
我想要实现的目标应该很简单,但它不起作用。
我在我的地图上添加了一个标记,我正在尝试将其设置为心跳动画。
我试过下面的代码,但没有成功,
ObjectAnimator pulse = ObjectAnimator.ofPropertyValuesHolder(userLocation,
PropertyValuesHolder.ofFloat("scaleX",2f),
PropertyValuesHolder.ofFloat("scaleY",2f)
);
pulse.setDuration(310);
pulse.setRepeatCount(ObjectAnimator.INFINITE);
pulse.setRepeatMode(ObjectAnimator.REVERSE);
pulse.start();
任何建议,将不胜感激,
加上使用外部库也是一种选择,我只是没有找到。
Cabezas answer 中详细描述了一般方法。除了他的回答,对于你的任务,你应该应用它来设置(根据动画的每一帧 Interpolator
调整大小)标记位图。例如,您可以使用这样的方法来完成:
private void pulseMarker(final Bitmap markerIcon, final Marker marker, final long onePulseDuration) {
final Handler handler = new Handler();
final long startTime = System.currentTimeMillis();
final Interpolator interpolator = new CycleInterpolator(1f);
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = System.currentTimeMillis() - startTime;
float t = interpolator.getInterpolation((float) elapsed / onePulseDuration);
marker.setIcon(BitmapDescriptorFactory.fromBitmap(scaleBitmap(markerIcon, 1f + 0.05f * t)));
handler.postDelayed(this, 16);
}
});
}
其中 16 是一帧动画的持续时间,1f + 0.05f * t
- 标记图标大小增加和减少 5%,scaleBitmap()
是:
public Bitmap scaleBitmap(Bitmap bitmap, float scaleFactor) {
final int sizeX = Math.round(bitmap.getWidth() * scaleFactor);
final int sizeY = Math.round(bitmap.getHeight() * scaleFactor);
Bitmap bitmapResized = Bitmap.createScaledBitmap(bitmap, sizeX, sizeY, false);
return bitmapResized;
}
电话是:
Bitmap markerIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_heart);
pulseMarker(markerIcon, marker, 1000);
其中 marker
是您的标记,1000
- 一个脉冲持续 1 秒。
我想要实现的目标应该很简单,但它不起作用。 我在我的地图上添加了一个标记,我正在尝试将其设置为心跳动画。
我试过下面的代码,但没有成功,
ObjectAnimator pulse = ObjectAnimator.ofPropertyValuesHolder(userLocation,
PropertyValuesHolder.ofFloat("scaleX",2f),
PropertyValuesHolder.ofFloat("scaleY",2f)
);
pulse.setDuration(310);
pulse.setRepeatCount(ObjectAnimator.INFINITE);
pulse.setRepeatMode(ObjectAnimator.REVERSE);
pulse.start();
任何建议,将不胜感激, 加上使用外部库也是一种选择,我只是没有找到。
Cabezas answer 中详细描述了一般方法。除了他的回答,对于你的任务,你应该应用它来设置(根据动画的每一帧 Interpolator
调整大小)标记位图。例如,您可以使用这样的方法来完成:
private void pulseMarker(final Bitmap markerIcon, final Marker marker, final long onePulseDuration) {
final Handler handler = new Handler();
final long startTime = System.currentTimeMillis();
final Interpolator interpolator = new CycleInterpolator(1f);
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = System.currentTimeMillis() - startTime;
float t = interpolator.getInterpolation((float) elapsed / onePulseDuration);
marker.setIcon(BitmapDescriptorFactory.fromBitmap(scaleBitmap(markerIcon, 1f + 0.05f * t)));
handler.postDelayed(this, 16);
}
});
}
其中 16 是一帧动画的持续时间,1f + 0.05f * t
- 标记图标大小增加和减少 5%,scaleBitmap()
是:
public Bitmap scaleBitmap(Bitmap bitmap, float scaleFactor) {
final int sizeX = Math.round(bitmap.getWidth() * scaleFactor);
final int sizeY = Math.round(bitmap.getHeight() * scaleFactor);
Bitmap bitmapResized = Bitmap.createScaledBitmap(bitmap, sizeX, sizeY, false);
return bitmapResized;
}
电话是:
Bitmap markerIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_heart);
pulseMarker(markerIcon, marker, 1000);
其中 marker
是您的标记,1000
- 一个脉冲持续 1 秒。