gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:16:35 25 4
gpt4 key购买 nike

这是我想要实现的目标。

当我点击一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com