Android анимация TRANSLATION_X выглядит по разному на разных экранах

Я использую следующий код, для анимации перемещения моей View, но конечная точка в которую приходит View после анимации, разная для разных устройств. Что я должен подать за место -400, чтобы анимация останавливалась в одной и той же точке на всех устройствах, не зависимо от экрана.

Мой код анимации:

   ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view,View.TRANSLATION_X,-400);
        AnimatorSet set = new AnimatorSet();
        set.play(objectAnimator);
        set.setDuration(550);
        set.start();

Ответы (2 шт):

Автор решения: ermak0ff

Сейчас вы перемещаете ваше view на 400 пикселей(px), но разрешение у устройств разное, поэтому и получаете что анимация у вас останавливается в разных точках.

Что бы на всех устройствах точка остановки находилась в одном и том же месте, вам нужно использовать dp(Density-independent Pixels), а уже их перевести в пиксели. Для перевода можете воспользоваться следующим методом:

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

т.е. ваша задача сначала перевести ваше значение в px, а уже потом передать в метод ofFloat().

→ Ссылка
Автор решения: Riky_Maritn
    final float moveLeftValue = 30f;
    final float moveRightValue = view.getLeft();

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, View.X, moveRightValue, moveLeftValue);

Конечным решением для меня стало использование view.getLeft(), чтобы рассчитать начальную точку (для моей анимации), которая и менялась визуально относительно нулевой точки в зависимости от экрана. Получается что в метод ofFloat() для анимации View.X подаются координаты. Для каждого устройства координаты не меняются, а меняется область их видимости, по этому точка 0;0 будет видна всегда не зависимо от устройства. А точка скажем 400;0 будет видна, только на некоторых устройствах. Поэтому её требуется считать динамически. Метод getLeft() как раз и возвращает значение, от нулевой точки до левого края квадрата view. Прибавляя к этому значению, можно получить точку, которая будет отображаться одинаково на всех экранах, но фактически в системе координат будет разная. Так же может произойти такая ситуация, что view.getLeft() вернёт ноль. Например так происходит после view.setVisibility(View.VISIBLE), если до этого view было View.GONE. Чтобы не получать ноль в первый раз, нужно чтобы view во время создания макета было View.INVISIBLE. Тогда view.getLeft() не возвращает ноль.

→ Ссылка