将UI元素的位置/大小设置为屏幕大小的百分比


73

我正在尝试确定在创建布局时是否可以使用百分比位置/大小。我想要的是这样的...

^
|
|
| 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单位了,但是我不确定是否也可以那样做。

我不得不承认UI设计是我的弱点,因此我们将不胜感激任何建议。

编辑:如果有人正在寻找类似的答案,以供将来参考,按照艾伦·摩尔的建议,我可以按照我的意愿进行以下工作...

<?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,还使用了浮点数作为权重。工作很棒。:)

Answers:


70

我认为您要设置的是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>

我会尝试的-我需要使TextView元素透明,因为它将具有背景图像(对不起,忘了提一下)。不过应该可以,谢谢。
Squonk 2011年

@AlanMoore这也适用于我,但是如果我想将高度和重量都定义为宽度,该怎么办?
Thev

@TheveshTheva,您好:如果我对您的理解正确,则需要将其设置为水平方向,然后使layout_width更像“ wrap_content”。
艾伦·摩尔

1
很好的答案,但是请注意,如果将LinearLayout的android:layout_weight =“ 1”替换为android:weightSum =“ 100”并将所有子项的高度设置为0dp,则可以删除其中一个TextView。这是因为在这种情况下,在LinearLayout上设置android:layout_weight无关紧要。如果您设置LinearLayout的android:weightSum,则所有未使用的权重将保持为空(与预期的一样)。
Jacob R

@JacobR,太棒了!实际上,我从未使用过weightSum,但一定会记住这一点。
艾伦·摩尔

18

对于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));

18

使用 PercentRelativeLayoutPercentFrameLayout百分比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>

2
天哪,太棒了。为什么要花这么长时间添加它。谢谢!你让我今天很开心。:)
肯尼·怀兰德'16

1
有点混乱,您需要自定义布局才能在内置布局中使用它...
Richard Lalancette

如何在尺寸文件中添加68%和16%。
Tushar Pandey

7
这两种布局,至今已贬值在Android的API级别26.1.0

7

通过ConstraintLayout通过Guide,也可以解决上述问题。

以下是代码段。

<?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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.