GoogleMap растягивается вместо размера после анимации брата - PullRequest
1 голос
/ 18 марта 2019

Вот чего я хочу добиться.

Когда я нажимаю кнопку FAB, меню будет отображаться внизу экрана.

Когда меню открывается / закрываетсяразмер карты должен быть изменен, чтобы при анимировании меню не было пустого пространства.

Моя проблема в том, что когда я анимирую контейнер карты (ViewPager), контейнер анимируется должным образом, но карта растягиваетсявместо изменения размера до нужных размеров.

У меня есть ViewPager с TabLayout, который отображает фрагмент на странице:

  • страница 1 (карта Google)
  • страница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 неправильно?

1 Ответ

1 голос
/ 19 марта 2019

Я думаю, что это из-за scale(). Как я только что протестировал, он отлично работает, если вы установите высоту в пикселях. Попробуйте ValueAnimator оживить высоту. Таким образом, вы должны заранее записать высоту открытой / закрытой карты. Пример:

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);
        ...
    }
}
...