谷歌地图v2片段视图在更改宽度时会闪烁

我的应用包含Google maps v2 API片段视图。 点击按钮,我想改变它的宽度,从左到右依次为:谷歌地图拍摄半屏 – >谷歌地图全屏显示。

它有效,但在宽度过渡期间,我在屏幕右侧看到奇怪的黑色区域。 我已经读过这是谷歌的错误,他们发布了修复程序,但它只能在Android 4.1版本之后运行。 我使用的是Android 4.0

此外,我检查了另一个人提到的一些变通方法,但他们都专注于滚动等任务。没有人提到谷歌地图视图宽度变化。

有人可以帮帮我吗?

我的xml:

     

谷歌地图初始化:

  mapFragment = (SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.map); map = mapFragment.getMap (); map.getUiSettings().setRotateGesturesEnabled(false); // disable rotation map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(54.6873439, 25.2770559) , 16.0f)); // set initial position map.getUiSettings().setZoomControlsEnabled(false); 

在“展开”按钮单击,我正在扩展谷歌地图,如下所示:

 ResizeWidthAnimation anim = new ResizeWidthAnimation(mapFragment.getView (), width); anim.setDuration(400); mapFragment.getView ().startAnimation(anim); 

动画类:

  public class ResizeWidthAnimation extends Animation { private int mWidth; private int mStartWidth; private View mView; public ResizeWidthAnimation(View view, int width) { mView = view; mWidth = width; mStartWidth = view.getWidth(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { int newWidth = mStartWidth + (int) ((mWidth - mStartWidth) * interpolatedTime); mView.getLayoutParams().width = newWidth; mView.requestLayout(); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); } @Override public boolean willChangeBounds() { return true; } } 

我们通过在地图顶部添加视图并为此视图宽度更改设置动画来解决此问题。 没有其他工作。

避免谷歌地图闪烁错误的提示:

  1. 不要对包含Google地图片段的片段进行“添加”或“替换”操作。 而是使用片段视图显示/隐藏操作。 使用这些操作时,这不会重新创建已创建的片段。 例如:

     FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft1 = manager.beginTransaction(); ft1.show (someFragment); ft1.hide (someFragment2); ft1.commit(); 
  2. 在应用程序执行期间,请勿尝试更改谷歌地图片段尺寸参数(宽度,高度,边距等)。 如果您需要一些谷歌地图动画,宽度更改等,请使用其他(其他)视图搜索变通方法。

在动画的每一帧上重新布线是非常昂贵的(甚至更多的地图),你不应该这样做。 如果您真的想要为地图的边界设置动画,请尝试应用缩放动画,然后在其末尾将视图重新布局到其最终的新尺寸并禁用缩放。

要使用地图或任何其他SurfaceView来提高动画性能,可以在MapFragment容器上调用requestTransparentRegion() ,并将自身作为参数传递。