Есть ли какая-либо единица, которую я могу использовать, которая будет масштабироваться напрямую? Единственный способ написать все в пикселях и умножить на правильный масштаб?
(scale = <real screen height>/<template base height> . and every dimension is <dimen in px> * scale
)
"dp" с подходом ведра у меня не работает - я пишу для маленьких экранов, где элемент долго находится вне экрана, прежде чем сработает следующий порог масштабирования dp.
В настоящее время мой обходной путь для рисования на холсте (ниже), но я не знаю, как согласовать его с использованием макетов xml.
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
screenScale = ((float) width) / (float) mBackgroundBitmap.getWidth();
mTopBarYOffset = mTopBarYOffset * screenScale;
mTopBarXOffset = mTopBarXOffset * screenScale;
//and so on for every dimension
Вы можете использовать ConstraintLayout.
В ConstraintLayout
вы можете работать с процентами следующим образом:
<Button
android:layout_width = "0dp"
android:layout_height = "0dp"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintHeight_percent = "0.6" //line 1
app:layout_constraintWidth_percent = "0.5" //line 2
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent"
/>
Итак, что я сделал - Я сказал, что моя кнопка должна быть равна 60% от ее родителя по высоте (см. строку 1) а также я сказал, что моя кнопка должна быть равна 50% ее родительской ширины (см. Строку 2).
Для более сложных макетов я бы также использовал методические рекомендации и Цепи, чтобы упростить создание адаптивного макета.
Спасибо, это работает очень хорошо! Немного не по теме... есть ли способ заставить редактор использовать/вычислять _percent
вместо layout_width/height
, когда я перемещаю/изменяю размер элементов? Было бы неплохо перетаскивать, а не печатать время от времени.
Я так не думаю, я думаю, что вы делаете размер своего представления в dp, когда растягиваете их из редактора. Если это было полезно, примите ответ, чтобы он мог помочь другим разработчикам с той же проблемой.
я поторопился с "это работает". Это работает для ширины и высоты элемента, но как насчет полей? После некоторой возни я не вижу никакого способа сделать запас, оставленный для экс. = 0,132 родителя. Итак, половина решения - я могу создавать элементы, но у меня нет возможности расположить их на экране.
небольшие размеры полей, такие как 8dp
или 16dp
, в порядке, у меня есть приложение в магазине Google Play с полями фиксированного размера, и, поскольку они маленькие, оно хорошо выглядит на всех устройствах.
Я могу сделать это, используя рекомендации для каждого поля, но это больше похоже на обходной путь, чем на решение ... Также это для износа ОС, поэтому размер экрана около 3 см в высоту. При использовании dp разница в положении залива составляет 4-5 мм в зависимости от экрана - незаметно на телефоне, но половина текста за пределами экрана на часах
Вы используете очень большие размеры полей, такие как 100dp
? .Если нет, вам не нужно об этом беспокоиться.
я сделал это, используя относительную компоновку и dp, но после того, как я попробовал это на меньших умных часах, макет конфигурации, который был в порядке на моих часах, был разбросан повсюду на меньшем.
Я говорил только о макетах телефонов, я думаю, что если вы хотите разработать макет для носимых устройств, вы можете использовать другой тип макета, как указано в документации носимые устройства.
Я знаю о носимых макетах, но у них у всех одна и та же проблема — слишком большие скачки между масштабированием дп. Они по-прежнему работают так же, как если я объявлю поле 16dp на одном экране, оно будет хорошо выравниваться с фоном с сеткой 5x5, но на другом текст в последней строке начнется в середине сетки. Если я выравниваю элементы по экрану, мне нужно использовать большие значения, если я выравниваю по предыдущим элементам, конечный эффект накопления «ошибок округления» будет таким же. Так что, пока это не изменено для износа ОС Google Константный макет - единственный способ идти.
Я пытаюсь выровнять элементы макета по границам, предварительно нарисованным на фоне, поэтому мне нужно, чтобы он выглядел одинаково на каждом экране, а не примерно одинаково - разница в 3 пикселя отбрасывает весь макет. Некоторая единица измерения, например %(экрана), была бы идеальной, но ее не существует.