Как уже упоминалось здесь многими людьми, мой подход также заключался бы в том, чтобы в полной мере использовать независимые от устройства компоненты, такие как paddins, margins и относительные макеты, в сочетании с независимыми от устройства пикселями.
Честно говоря, и я надеюсь, что я не единственный, но в полной мере использующий DIP (независимые от устройств пиксели) и относительное размещение и так далее ... уменьшил мои файлы макета активности до 1 за действие вместо 3 различных вида для HDPI, MDPI и LDPI.
В случае, если вы действительно обеспокоены соотношением сторон, вы всегда можете вызвать свойства дисплея в пикселях устройства и выполнить соответствующие расчеты макета на основе этих цифр. Вы можете вызвать это в самом начале метода onCreate вашего первого действия.
Display display = getWindowManager().getDefaultDisplay();
int displayWidth = display.getWidth();
int displayHeight = display.getHeight();
это даст вам значения ширины и высоты вашего аппаратного siplay в пикселях.
По моему мнению, истинная причина, по которой вы бы выбрали более 3 типов макетов, заключается в том, чтобы разрешение изображения оставалось достаточно резким.
С этими числами вы можете создать некоторую внутреннюю логику, которая рассчитывает тип изображения с разрешением для загрузки в определенные виджеты. Это избавляет вас от необходимости делать в 3 раза одинаковую разметку ....
Может быть, немного загадочно объяснить, но главное, чтобы преодолеть различные разрешения устройств, - это много работать с:
- relativelayouts
- Пиксели, не зависящие от устройства
вы также можете определить DIP в макете XML, чтобы каждый компонент выглядел одинаково на всех типах устройств.
Может быть, глупый пример, но эй, у меня это сработало :-)
здесь ниже я попытался сделать так, чтобы размер текста в textview был одинаковым на всех устройствах. Вы можете вызвать класс TypedValue и выбрать одну из множества открытых переменных, предлагаемых там. Поскольку я хотел, чтобы TextView везде имел одинаковый относительный размер, я использовал следующий код:
someTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
число, чтобы установить, насколько большим должен быть размер в DIP.
TypedValue можно использовать во многих компонентах виджетов или действий, для которых требуется значение INT для размерных свойств. Поиграйте с этим, и вы увидите, что это делает жизнь намного проще: -p
надеюсь, что этот ответ немного поможет