Установить позицию / размер элемента интерфейса в процентах от размера экрана - PullRequest
67 голосов
/ 22 сентября 2011

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

^
|
|
| 68%
|
|
v
Gallery (height equivalent of 16% total screen size)
^
| 16%
v

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" > 
    <Gallery 
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="80px"
        android:layout_marginTop ="320px"
    />
</RelativeLayout>

Очевидно, я не хочу жестко кодировать фиксированные px единицы, но я не могу использовать 68% или 0.68 для layout_marginTop (например).Я смотрел на dp юнитов, но я не уверен, что смогу сделать это и так.

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

РЕДАКТИРОВАТЬ: Для дальнейшего использования, если кто-то ищет подобный ответ, следуя предложению Алана Мура, у меня есть следующее, работающее именно так, как я хочу ...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@drawable/bground"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="0.68"
        android:background="@android:color/transparent"
    />
    <Gallery 
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.16"
    />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="0.16" 
        android:background="@android:color/transparent"
    />
</LinearLayout>

Мне удалось найти некоторые другие примеры использования layout_weight и я решил установить высоту TextView равной 0dp, а также использовал поплавки для весов.Работает отлично.:)

Ответы [ 5 ]

66 голосов
/ 22 сентября 2011

Я думаю, вам нужно установить android: layout_weight,

http://developer.android.com/resources/tutorials/views/hello-linearlayout.html

примерно так (я просто помещаю текстовые представления выше и ниже в качестве заполнителей):

  <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:weightSum="1">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="68"/>
    <Gallery 
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="0dp"

        android:layout_weight="16"
    />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="16"/>

  </LinearLayout>
17 голосов
/ 11 декабря 2015

Используйте PercentRelativeLayout или PercentFrameLayout из библиотеки Percent Supoort

<android.support.percent.PercentFrameLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
     <TextView
          android:layout_width="match_parent"
          app:layout_heightPercent="68%"/>
     <Gallery 
          android:id="@+id/gallery"
          android:layout_width="match_parent"
          app:layout_heightPercent="16%"/>
     <TextView
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:layout_width="match_parent"/>
</android.support.percent.PercentFrameLayout>
16 голосов
/ 22 сентября 2011

Для TextView и его потомков (например, Button) вы можете получить размер экрана из WindowManager, а затем установить высоту TextView, равную некоторой его части:

Button btn = new Button (this);
android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
btn.setHeight((int)(display.getHeight()*0.68));
5 голосов
/ 26 февраля 2018

Приведенную выше проблему также можно решить с помощью ConstraintLayout через Guidelines.

Ниже приведен фрагмент кода.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.constraint.Guideline
    android:id="@+id/upperGuideLine"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.68" />

<Gallery
    android:id="@+id/gallery"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@+id/lowerGuideLine"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/upperGuideLine" />

<android.support.constraint.Guideline
    android:id="@+id/lowerGuideLine"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.84" />

</android.support.constraint.ConstraintLayout>
1 голос
/ 22 сентября 2011

Взгляните на это:

http://developer.android.com/reference/android/util/DisplayMetrics.html

Вы можете получить высоту экрана, и это простая математика для расчета 68 процентов экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...