Как обеспечить правильное/прямое масштабирование размеров на Android в макетах и ​​в других местах?

Есть ли какая-либо единица, которую я могу использовать, которая будет масштабироваться напрямую? Единственный способ написать все в пикселях и умножить на правильный масштаб?

(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

Я пытаюсь выровнять элементы макета по границам, предварительно нарисованным на фоне, поэтому мне нужно, чтобы он выглядел одинаково на каждом экране, а не примерно одинаково - разница в 3 пикселя отбрасывает весь макет. Некоторая единица измерения, например %(экрана), была бы идеальной, но ее не существует.

Lord_JABA 19.07.2019 15:31
2
1
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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, когда я перемещаю/изменяю размер элементов? Было бы неплохо перетаскивать, а не печатать время от времени.

Lord_JABA 20.07.2019 18:36

Я так не думаю, я думаю, что вы делаете размер своего представления в dp, когда растягиваете их из редактора. Если это было полезно, примите ответ, чтобы он мог помочь другим разработчикам с той же проблемой.

Tamir Abutbul 20.07.2019 18:39

я поторопился с "это работает". Это работает для ширины и высоты элемента, но как насчет полей? После некоторой возни я не вижу никакого способа сделать запас, оставленный для экс. = 0,132 родителя. Итак, половина решения - я могу создавать элементы, но у меня нет возможности расположить их на экране.

Lord_JABA 20.07.2019 18:58

небольшие размеры полей, такие как 8dp или 16dp, в порядке, у меня есть приложение в магазине Google Play с полями фиксированного размера, и, поскольку они маленькие, оно хорошо выглядит на всех устройствах.

Tamir Abutbul 20.07.2019 19:07

Я могу сделать это, используя рекомендации для каждого поля, но это больше похоже на обходной путь, чем на решение ... Также это для износа ОС, поэтому размер экрана около 3 см в высоту. При использовании dp разница в положении залива составляет 4-5 мм в зависимости от экрана - незаметно на телефоне, но половина текста за пределами экрана на часах

Lord_JABA 20.07.2019 19:07

Вы используете очень большие размеры полей, такие как 100dp? .Если нет, вам не нужно об этом беспокоиться.

Tamir Abutbul 20.07.2019 19:09

я сделал это, используя относительную компоновку и dp, но после того, как я попробовал это на меньших умных часах, макет конфигурации, который был в порядке на моих часах, был разбросан повсюду на меньшем.

Lord_JABA 20.07.2019 19:13

Я говорил только о макетах телефонов, я думаю, что если вы хотите разработать макет для носимых устройств, вы можете использовать другой тип макета, как указано в документации носимые устройства.

Tamir Abutbul 20.07.2019 19:16

Я знаю о носимых макетах, но у них у всех одна и та же проблема — слишком большие скачки между масштабированием дп. Они по-прежнему работают так же, как если я объявлю поле 16dp на одном экране, оно будет хорошо выравниваться с фоном с сеткой 5x5, но на другом текст в последней строке начнется в середине сетки. Если я выравниваю элементы по экрану, мне нужно использовать большие значения, если я выравниваю по предыдущим элементам, конечный эффект накопления «ошибок округления» будет таким же. Так что, пока это не изменено для износа ОС Google Константный макет - единственный способ идти.

Lord_JABA 20.07.2019 19:38

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