我想知道是否可以为 Google 地图标记沿 x 轴和 y 轴旋转设置动画,就像我们如何使用 ObjectAnimator 围绕 x 轴和/或 y 轴旋转 ImageView 一样。显然,人们可以顺时针旋转(改变)标记的方向,即沿着 z 轴(在 X-Y 平面中),但我似乎无法找到类似的东西来围绕 x 或 y 旋转标记(位图) -轴。我发现很少有像这样的讨论this这可能与我正在寻找的内容有某种关系,但我对如何解决这个问题感到相当困惑。任何帮助是极大的赞赏!
UPDATE I我做了进一步的研究,并提出了如何解决这个问题的建议:
谷歌地图Marker
有一个设置其图标的setter方法,称为setIcon
。不仅通过MarkerOption
也可以作为一种独立的方法来重置Marker
图标。该方法期望一个BitmapDescriptor
传入以更新图标。使用BitmapDescriptorFactory
一个人可以很容易地得到一个BitmapDescriptor
从给定的Bitmap
目的。
自从谷歌地图Marker
不支持 3D 旋转,我们需要以某种方式旋转Bitmap
它代替了Marker
图标外Marker
本身。就我的发现而言,做到这一点的一种方法是创建一个Canvas
and a Camera
对象,而前者链接到Drawable
要进行 3D 旋转,后者用于实际执行 3D 旋转。
Using Camera
辅助方法如rotateX
, rotateY
, and rotateZ
,除了任何必要的翻译外,还可以获得一份定制的Matrix
实例。通过应用这个Matrix
to Canvas
使用,例如,concat
or setMatrix
方法中,我们强制执行轮换。
可绘制对象可以链接到Canvas
,也就是说,我们可以使用Drawable.draw(Canvas canvas)
方法来实际绘制Bitmap
同时应用 3D 变换。假设Canvas
对象链接到Bitmap
。这样,可绘制对象的转换版本现在应该由Bitmap
实例。
Using Marker
设置方法setIcon
,我们首先回收旧的BitmapDescriptor
然后创建一个新对象,并将该对象传递给setIcon
.
问题:我想知道这是否是实现我正在寻找的目标的最佳方式。此外,如何实际完成动画。我确信有一种方法像使用的方法Animation
并覆盖它applyTransformation(float interpolatedTime, Transformation t)
不起作用,因为它仅适用于View
对象。我进一步相信我最好使用ValueAnimator
它为运行动画提供了必要的时序引擎,即计算动画值并将其设置在目标对象上,在本例中为旋转值。
更新二我想出了以下代码片段,它几乎是不言自明的。不幸的是,一旦动画开始,图标就被删除了,什么也没有。我捕获了日志以确保ValueAnimator
确实有效,而且事实证明它确实有效。我还删除了所有转换并确保Matrix
是身份,但这没有帮助。得到Drawable
并试图将其纳入Bitmap
实例通过Canvas
还是不行。事实上,当动画开始时,图标就被简单地删除了。为了验证位图文件是否确实被创建以供替换,我尝试对位图进行采样并将其以 PNG 格式保存到 SDCARD 中。已确认保存的 PNG 都是空白的,这就是图标被删除的原因。任何想法?
private void animateMarker() {
if (mCamera == null) {
mCamera = new Camera();
}
ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
animator.setDuration(300);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// float interpolatedTime = ((Float) (animation.getAnimatedValue())).floatValue();
// final double radians = Math.PI * interpolatedTime;
// float degrees = (float) (180.0 * radians / Math.PI);
final Matrix matrix = new Matrix();
// mCamera.translate(0.0f, 0.0f, (float) (150.0 * Math.sin(radians)));
// mCamera.rotateX(degrees);
// mCamera.rotateY(degrees);
// mCamera.rotateZ(degrees);
// mCamera.getMatrix(matrix);
Resources resources = mContext.getResources();
Drawable drawable = resources.getDrawable(R.drawable.custom_pin);
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
// mCamera.applyToCanvas(canvas);
// canvas.setMatrix(matrix);
// drawable.draw(canvas);
canvas.drawBitmap(bitmap, matrix, null);
mMarkerSetLocation.setIcon(mBitmapDescriptorFactory.fromBitmap(bitmap));
}
});
animator.start();
}