Изменение расположения элементов View на разметке
Мне необходимо изменять местоположение разных view (textView, imageView) внутри разметки RelativeLayout через Kotlin-код, работать это должно не только при нажатии кнопки.
Например, есть imageView с id = "image", у которого размеры width и height устанавливаются внутри onCreate() в значение size. Так же он изначально привязан к нижнему и левому краям со значениями 100dp.
И я сдвигаю этот элемент вправо с помощью image.x = size. В итоге данное изображение сдвигается, однако выглядит это не лучшим образом:

Все примеры в интернете, которые я нашел, используются для Java-кода, и адаптировать его на Kotlin я не смог. Кнопка сдвигается точно так же, макет находится в первоначальном месте, а сама кнопка сдвинута. Нажатие на макет ничего не вызывает, а нажатие на кнопку обрабатывается так, как должно. Какие лучшие альтернативы этому способу?
Передвигать элемент нажатием на него не собираюсь, собираюсь передвигать его со временем и при нажатии разных кнопок, а так же при выполнении разных условий.
Ответы (2 шт):
Margin можно изменять програмно вот так:
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right,
bottom);
yourimageview.setLayoutParams(params);
Итак, по комментариям к вопросу и по ответу (который дан на JS, при вопросе заданном про Kotlin), все сводится к изменению image.layoutParams
Однако, данный способ не применим в Котлине:
var params = image.layoutParams
params.leftMargin = size // ошибка
image.layoutParams = params
Так как у класса ViewGroup.LayoutParams! нету свойства leftMargin (как и marginLeft, и всех остальных марджинов)
Решение данной проблемы - в том, какой именно класс мы используем. Решение следующее:
var params = image.layoutParams as ViewGroup.MarginLayoutParams
params.leftMargin = size // никакой ошибки
image.layoutParams = params
И с классом ViewGroup.MarginLayoutParams уже нет никаких проблем, и любой объект можно двигать по экрану без проблем.