Анимируйте изменение размера ImageView до размера другого ImageView - PullRequest
0 голосов
/ 24 октября 2018

У меня есть изображение, которое я хочу анимировать и переместить в другое местоположение ImageView.

В настоящее время я занимаюсь этим:

                v.animate()
                    .scaleX(??)
                    .scaleY(??)
                    .x(target.x)
                    .y(target.y)
                    .setDuration(1000)
                    .start()

Мой вопрос заключается в том, как рассчитатьправильный масштабный коэффициент для х и у?Если я установлю параметры макета равными параметрам макета цели, то он будет работать нормально, но не будет анимированным.Я пытался разделить ширину и высоту исходного изображения на целевое изображение, но оно не давало мне правильный масштаб.

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

создает значение с плавающей запятой для соотношений между двумя изображениями:

float w_ratio = (targetImage.getMeasuredWidth() - sourceImage.getMeasuredWidth()) / sourceImage.getMeasuredWidth();
float h_ratio = (targetImage.getMeasuredHeight() - sourceImage.getMeasuredHeight()) / sourceImage.getMeasuredHeight();

// then animate:

v.animate().scaleXBy(w_ratio).scaleYBy(h_ratio).setDuration(1000);

// Don't forget to reset the size later if needed, using:

v.setScaleX(1.0f);
v.setScaleY(1.0f);
0 голосов
/ 24 октября 2018

Чтобы получить координаты x и y вашего целевого imageView, напишите следующий код.

    x = imageViewObject.getLeft(); 
    y = imageViewObject.getTop();

Для анимации вам необходимо внести следующие изменения в ваш код

v.animate()
                .scaleX(0) // This will be your initial x position of your imageView
                .scaleY(0) // This will be your initial y position of your imageView
                .x(x)      // This will be the x position of your target imageView
                .y(y)      // This will be the y position of your target imageView
                .setDuration(1500)
                .start()

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

0 голосов
/ 24 октября 2018

Решением будет получение фактической ширины и высоты изображений с помощью getMeasuredWidth () и getMeasuredHeight (), а затем деление для вычисления коэффициента масштабирования.Обратите внимание, что использование getWidth () и getHeight () не является хорошим вариантом, поскольку они содержат информацию о ширине и высоте (например, целочисленное значение MATCH_PARENT), а не окончательное вычисленное значение.Также обратите внимание, что измеренный с помощью и высота доступна после того, как пользовательский интерфейс был выложен.Если ваша анимация должна быть сделана при создании действия, вы должны запустить ее в onWindowFocusChanged, в это время размеры макета уже рассчитаны (если я правильно помню).

imageViewToBeChanged
    .animate()
    .scaleX(targetImageView.getMeasuredWidth() / imageViewToBeChanged.getMeasuredWidth())
    .scaleY(targetImageView.getMeasuredHeight() / imageViewToBeChanged.getMeasuredHeight())
    .x(target.x)
    .y(target.y)
    .setDuration(1000)
    .start()

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...