Как сделать аниматор объектов Android отзывчивым?

Здесь значение 200 получается разным на разных экранах. Есть ли способ решить эту проблему?

 MarginProxy marginProxy = new MarginProxy(fab);
                        ObjectAnimator marginAnimation = ObjectAnimator.ofInt(marginProxy, "bottomMargin", 530, 200).setDuration(300);
                        marginAnimation.start();

Когда анимация запущена, кнопка перемещается по-другому на другом экране (пиксель) и в другую позицию на другом устройстве (Samsung J7)
Это маржинальный прокси класс

class MarginProxy {
    private View mView;

    public MarginProxy(View view) {
        mView = view;
    }
public int getLeftMargin() {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    return lp.leftMargin;
}

public void setLeftMargin(int margin) {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    lp.setMargins(margin, lp.topMargin, lp.rightMargin, lp.bottomMargin);
    mView.requestLayout();
}

public int getTopMargin() {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    return lp.topMargin;
}

public void setTopMargin(int margin) {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    lp.setMargins(lp.leftMargin, margin, lp.rightMargin, lp.bottomMargin);
    mView.requestLayout();
}

public int getRightMargin() {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    return lp.rightMargin;
}

public void setRightMargin(int margin) {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    lp.setMargins(lp.leftMargin, lp.topMargin, margin, lp.bottomMargin);
    mView.requestLayout();
}

public int getBottomMargin() {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    return lp.bottomMargin;
}

public void setBottomMargin(int margin) {
    MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
    lp.setMargins(lp.leftMargin, lp.topMargin, lp.rightMargin, margin);
    mView.requestLayout();
}
}

1 ответ

Решение

Вместо использования пикселей вы должны использовать провалы.

public int convertDiptoPix(int dip){
float scale = getDensity();
return (int) (dip * scale + 0.5f);}

Затем обменяйте свои значения в 200 пикселей на результат этого метода.

Другие вопросы по тегам