Как расположить представление с полем, которое будет выглядеть одинаково для всех устройств?

Я пытаюсь расположить вид в центре, чтобы он хорошо выглядел, программно добавив 130 (margin-top), однако я не уверен, как заставить другие устройства Android, такие как планшеты, выглядеть одинаково? добавление 130 к верхнему полю выглядит хорошо на обычном телефоне Android, но будет выглядеть иначе на планшете. Как я смогу сделать логику, чтобы дать верхнее поле, которое обеспечит одинаковый вид на всех устройствах? Некоторые примеры или советы были бы замечательными! Я хотел бы услышать от вас!

margin_top = 130 // How to make this look good on all devices? 

ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(0, margin_top, 0, 0);
v.requestLayout();

person Jennifer    schedule 06.08.2018    source источник
comment
Какой вид макета является родительским макетом?   -  person    schedule 06.08.2018
comment
Почему бы вам не использовать FrameLayout/LinearLayout с gravity=center. Или RelativeLayout с alignSelf=parentBottom, или раскладка Constraint?   -  person Khemraj Sharma    schedule 06.08.2018
comment
Представление, которое является imageView, находится в LinearLayout, а LinearLayout — внутри RelativeLayout. Я хочу знать, можно ли сделать маржу, подходящую для всех устройств.   -  person Jennifer    schedule 06.08.2018
comment
Я думаю, вы можете использовать height или weight устройства и процент для создания верхнего поля. Что-то вроде верхнего поля должно быть 0.15 * height.   -  person grrigore    schedule 06.08.2018
comment
Таким образом, центр родительского линейного макета может не быть центром относительного макета?   -  person    schedule 06.08.2018
comment
@grrigore Я чувствую, что то, о чем ты думаешь, может быть для меня ключом! Знаете ли вы какой-либо образец для него?   -  person Jennifer    schedule 06.08.2018
comment
@mTak Да, центр родительского linearlayout на этот раз не центр!   -  person Jennifer    schedule 06.08.2018
comment
@user3264924 user3264924 ознакомьтесь с этим ответом.   -  person grrigore    schedule 06.08.2018
comment
@grrigore Спасибо за ответ, но, поскольку я новичок в Android, я не уверен, что означает высота устройства 0,15 *. На этот раз я почувствовал, что верхняя граница 130 выглядит хорошо на телефоне, тогда, в этом случае, как мне рассчитать?   -  person Jennifer    schedule 06.08.2018
comment
@user3264924 user3264924 Это также означает, что если родительский linearlayout не покрывает необходимую область вокруг центра, то эта проблема неразрешима.   -  person    schedule 06.08.2018
comment
@user3264924 user3264924 хорошо, если вы знаете высоту телефона, вы можете рассчитать соотношение (вес телефона / 130), а затем попробовать его на планшете или чем-то еще (рацион * высота устройства). Я не знаю, работает ли это, это просто то, что пришло мне в голову. ЛЭ: Я также думаю, что все должно быть в пикселях. Если вы можете сказать мне высоту телефона, я мог бы написать ответ, и вы можете попробовать.   -  person grrigore    schedule 06.08.2018


Ответы (1)


Мой подход к этому следующий:

1). Получите высоту устройства. Также проверьте этот ответ.

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;

2). Рассчитайте коэффициент.

Я полагаю, вы установили верхнее поле 130dp. Используя pixplicity, мне удалось преобразовать его в px.

dp в px

У вашего телефона разрешение высота x вес в пикселях. Определим высоту как phoneHeight.

Здесь мне тоже становится немного сложно. Как вы можете видеть, 130dp имеет разные значения пикселей для ldpi, mdpi и т. д. Лично я не знаю, какой из них вам следует использовать, вы можете попробовать mdpi. (Я постараюсь изучить больше и вернуться с ответом).

LE:

Вы можете использовать этот метод для преобразования dp в пиксели в соответствии с вашим телефоном. (См. этот ответ).

public static float convertDpToPixel(float dp, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return px;
}

Используйте возвращенные px в формулу ниже. (назовем возвращенный px - convertedPx.

3). Формула для значения верхнего поля.

Если мы используем значение 130dp для mdpi из таблицы, мы получим 130px. Таким образом, формула будет:

margin_top = (convertedPx / phoneHeight) * height

где phoneHeight — высота телефона, на котором вы в данный момент тестируете, а height — высота устройства, использующего displayMetrics.

ВНИМАНИЕ: convertedPx будет константой. Вам нужно только запустить этот метод (convertDpToPixel) на своем телефоне, чтобы узнать, сколько 130dp означает в пикселях.

person grrigore    schedule 06.08.2018
comment
Если что-то неясно, пожалуйста, дайте мне знать. Я очень устал и не могу объяснить это очень хорошо. - person grrigore; 06.08.2018
comment
ВНИМАНИЕ: convertedPx / phoneHeight отчет должен быть извлечен при тестировании на вашем телефоне в виде отношения и использовать это соотношение как константу. Кроме того, вам, возможно, придется снова преобразовать margin_top в dp (поскольку метод setMargins использует dp), проверьте этот ответ для метода. - person grrigore; 06.08.2018
comment
Большое спасибо!!!! Я это проверю! Да, я дам вам знать, если я найду что-то непонятное! - person Jennifer; 06.08.2018
comment
Большое спасибо! Ваше решение было лучшим! Задача решена! - person Jennifer; 09.08.2018
comment
В чем разница между phoneHeight и height? - person Pir Shukarullah Shah; 24.10.2018
comment
@PirShukarullahShah phoneHeight - высота телефона, на котором вы сейчас тестируете (допустим, ваш телефон 120x350) -> phoneHeight равно 120. height - высота устройства, использующего displayMetrics (вы получаете это значение, используя метод, описанный в 1).) - person grrigore; 24.10.2018
comment
Извините за этот вопрос, но как получить phoneHeight? Я использую displayMetrics как phoneHeight. - person Pir Shukarullah Shah; 24.10.2018
comment
@PirShukarullahShah Да, используйте метод из шага 1). и сохраните значение height (запишите его на бумаге), это phoneHeight. - person grrigore; 24.10.2018