android - 谷歌地图在兄弟动画后被拉伸(stretch)而不是调整大小

标签 android google-maps android-animation

这是我想要实现的目标。

当我点击一个 FAB 按钮时,一个菜单将显示在屏幕底部。

打开/关闭菜单时,必须调整 map 大小,以便在动画菜单时没有空白区域。

我的问题是,当我为 map 的容器 (ViewPager) 设置动画时,容器按预期设置动画,但 map 被拉伸(stretch)而不是调整到适当的尺寸。

我有一个带有 TabLayout 的 ViewPager,每页显示一个 fragment :

  • 第 1 页(谷歌地图)
  • 第 2、3 页等。

这是我的切换菜单代码:

    public void animateFAB(FABStates state) {
        if (state.equals(FABStates.show)) {
            isFABOpen = true;

            viewPager.animate()
                    .scaleY(1f)
                    .setInterpolator(INTERPOLATOR)
                    .setDuration(500);

            mapUtilsContainer.animate().scaleY(1f)
                                .setInterpolator(INTERPOLATOR)
                                .setDuration(500);

            MapView mapV = mapFragment.getMapView();
            ViewGroup.LayoutParams lps = mapV.getLayoutParams();
            lps.height = ViewGroup.LayoutParams.MATCH_PARENT;
            mapV.requestLayout();

//            for (int v = 0; v < FABMenu.length; v++) {
//                FABMenu[v].animate().translationX(0).setStartDelay(90 * v);
//            }
        } else {
            isFABOpen = false;
            mapUtilsContainer.setPivotY(mapUtilsContainer.getMeasuredHeight());
            mapUtilsContainer.setPivotX(0);

            viewPager.animate()
                    .scaleY(1.5f)
                    .setInterpolator(INTERPOLATOR)
                    .setDuration(500);
            mapUtilsContainer.animate()
                    .scaleY(0f)
                    .setInterpolator(INTERPOLATOR)
                    .setDuration(500);
            MapView mapV = mapFragment.getMapView();
            ViewGroup.LayoutParams lps = mapV.getLayoutParams();
            lps.height = ViewGroup.LayoutParams.MATCH_PARENT;
            mapV.requestLayout();

//            for (int v = 0; v < FABMenu.length; v++) {
//                FABMenu[v].animate().translationX(10000).setStartDelay(90 * v);
//            }
        }
    }

选项 2

    public void animateFAB(FABStates state) {
        if (state.equals(FABStates.show)) {
            isFABOpen = true;

            ValueAnimator va = ValueAnimator.ofInt(ViewGroup.LayoutParams.WRAP_CONTENT, 0);
            va.setDuration(500);
            va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                public void onAnimationUpdate(ValueAnimator animation) {
                    Integer value = (Integer) animation.getAnimatedValue();
                    mapUtilsContainer.getLayoutParams().height = value.intValue();
                    mapUtilsContainer.requestLayout();
                }
            });
            va.start();

            View v = findViewById(R.id.coordinator_layout);
            v.requestLayout();

//            for (int v = 0; v < FABMenu.length; v++) {
//                FABMenu[v].animate().translationX(0).setStartDelay(90 * v);
//            }
        } else {
            isFABOpen = false;

            ValueAnimator va = ValueAnimator.ofInt(0, ViewGroup.LayoutParams.WRAP_CONTENT);
            va.setDuration(500);
            va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                public void onAnimationUpdate(ValueAnimator animation) {
                    Integer value = (Integer) animation.getAnimatedValue();
                    mapUtilsContainer.getLayoutParams().height = value.intValue();
                    mapUtilsContainer.requestLayout();
                }
            });
            va.start();

            View v = findViewById(R.id.coordinator_layout);
            v.requestLayout();

//            for (int v = 0; v < FABMenu.length; v++) {
//                FABMenu[v].animate().translationX(10000).setStartDelay(90 * v);
//            }
        }
    }

WRAP_CONTENT 是否在这里使用不当?

最佳答案

我认为这是因为 scale()。正如我刚刚测试的那样,如果您以像素为单位设置高度,它就可以正常工作。尝试使用 ValueAnimator 来设置高度动画。这样你应该事先记录 map 的打开/关闭高度。示例:

ValueAnimator va = ValueAnimator.ofInt(oldHeight, newHeight);
va.setDuration(500);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    public void onAnimationUpdate(ValueAnimator animation) {
        Integer value = (Integer) animation.getAnimatedValue();
        v.getLayoutParams().height = value.intValue();
        v.requestLayout();
    }
});

代替 WRAP_CONTENT 在打开时分配初始高度并使用它重新打开:

public void animateFAB(FABStates state) {
    if (state.equals(FABStates.show)) {
        isFABOpen = true;
        initialHeight = mapUtilsContainer.getLayoutParams().height; 
        ValueAnimator va = ValueAnimator.ofInt(initialHeight, 0);
        ...
    } else {
        isFABOpen = false;
        ValueAnimator va = ValueAnimator.ofInt(0, initialHeight);
        ...
    }
}

关于android - 谷歌地图在兄弟动画后被拉伸(stretch)而不是调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55229595/

相关文章:

google-maps - 如何为谷歌地图标记添加自定义工具提示?

android - 对 fragment 进行动画处理,使其部分脱离屏幕

java - 如何为布局的宽度和高度设置动画?

android - 如何在android中为progressBar设置流畅的动画

android - Android 2.3.6 上的操作栏

swift - 谷歌标记聚类。如何将此库添加到项目中? swift

android - Android涂抹布局

asp.net - 在谷歌地图和谷歌地球之间切换

android - 在单选组 android 中再次检查单选按钮

java - 如何为不同屏幕尺寸的 android studio 自动调整 imageview 的大小?