【问题标题】:android layout margins with percentageandroid布局边距百分比
【发布时间】:2013-04-24 19:37:23
【问题描述】:

我想按百分比设置边距。我在线性布局中有 4 个图像视图,并希望设置默认的左、右、上、下边距,使每个屏幕尺寸保持相同的百分比。

有可能吗?

这是我想要的演示..

这是我尝试过但不起作用的方法

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:weightSum="10" >

        <Thumbnail
            android:id="@+id/thumb1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="4" />

        <Thumbnail
            android:id="@+id/thumb2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="4" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:weightSum="10" >

         <Thumbnail
             android:id="@+id/thumb3"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="4" >
         </Thumbnail>

        <Thumbnail
            android:id="@+id/thumb4"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="4" />

    </LinearLayout>

</LinearLayout>

感谢您的帮助

【问题讨论】:

    标签: android android-linearlayout


    【解决方案1】:

    您可以在LinearLayouts 中使用不可见的Views 作为分隔符,并使用layout_weight 机制为其分配相对大小。

    例子:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">
    
        <Thumbnail
            android:id="@+id/thumb1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="4" />
    
        <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:visibility="invisible"/>
    
        <Thumbnail
            android:id="@+id/thumb2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="4" />
    
    </LinearLayout>
    

    【讨论】:

    • 逻辑如果没有其他方法:) 但不确定内存使用情况,因为我需要这么多不可见的视图
    • 有一个&lt;Space&gt; 视图。我认为使用不可见的View 不会对性能/内存造成任何损失,但真的不确定 - View.java 很大,只浏览了几分钟。
    • @AlexanderMalakhov Space 在 API 级别 14 中添加,因此它没有那么有用。不过,它的命名使目的更加明显。
    • 有android.support.v7.widget.Space。虽然这可能是一个额外的依赖。
    • android.support.v7.widget.Space 已弃用。请改用 android.support.v4.widget.Space。
    【解决方案2】:

    2017 年 8 月 1 日添加:

    此答案中的两种布局现已弃用,但那里提供了有关如何使用 ConstraintLayout 获得相同功能的描述。感谢dpg 指出这一点。

    如果您打算将百分比与资源一起使用,this answer 可能会有用。


    旧答案:

    现在支持库版本 23.0.0 出现了一种更好的方法(大约是时候了,对吧?)。您现在可以使用PercentFrameLayout 或PercentRelativeLayout。它们都具有以下属性:

    • layout_widthPercent
    • layout_heightPercent
    • layout_marginPercent
    • layout_marginLeftPercent
    • layout_marginTopPercent
    • layout_marginRightPercent
    • layout_marginBottomPercent
    • layout_marginStartPercent
    • layout_marginEndPercent

    你也可以看看PercentLayoutHelper.PercentLayoutParams

    【讨论】:

    • 这仅适用于 Android 6 吗?
    • 百分比布局在百分比支持库中,这意味着它们不仅适用于 Android 6。
    • 新的更好的方法现在已被弃用。对于链接上的两种布局:This class was deprecated in API level 26.0.0-beta1. consider using ConstraintLayout and associated layouts instead.
    • 也许您的意思是“...如何使用 CoordinatorLayout... 获得相同的功能”中的 ConstraintLayout?
    【解决方案3】:

    您可以使用ConstraintLayout's 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:srcCompat="@drawable/ic_launcher_background"
            app:layout_constraintTop_toTopOf="@+id/horGuideline1"
            app:layout_constraintStart_toStartOf="@+id/verGuideline1"
            app:layout_constraintEnd_toStartOf="@+id/verGuideline2"
            app:layout_constraintBottom_toTopOf="@+id/horGuideline2" />
    
        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:srcCompat="@drawable/ic_launcher_background"
            app:layout_constraintTop_toTopOf="@+id/horGuideline1"
            app:layout_constraintStart_toStartOf="@+id/verGuideline3"
            app:layout_constraintEnd_toStartOf="@+id/verGuideline4"
            app:layout_constraintBottom_toTopOf="@+id/horGuideline2" />
    
        <ImageView
            android:id="@+id/imageView3"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:srcCompat="@drawable/ic_launcher_background"
            app:layout_constraintTop_toTopOf="@+id/horGuideline3"
            app:layout_constraintStart_toStartOf="@+id/verGuideline1"
            app:layout_constraintEnd_toStartOf="@+id/verGuideline2"
            app:layout_constraintBottom_toTopOf="@+id/horGuideline4" />
    
        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:srcCompat="@drawable/ic_launcher_background"
            app:layout_constraintTop_toTopOf="@+id/horGuideline3"
            app:layout_constraintStart_toStartOf="@+id/verGuideline3"
            app:layout_constraintEnd_toStartOf="@+id/verGuideline4"
            app:layout_constraintBottom_toTopOf="@+id/horGuideline4" />
    
        <android.support.constraint.Guideline
            android:id="@+id/verGuideline1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.05" />
    
        <android.support.constraint.Guideline
            android:id="@+id/verGuideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.35" />
    
        <android.support.constraint.Guideline
            android:id="@+id/verGuideline3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.65" />
    
        <android.support.constraint.Guideline
            android:id="@+id/verGuideline4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.95" />
    
        <android.support.constraint.Guideline
            android:id="@+id/horGuideline1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.12" />
    
        <android.support.constraint.Guideline
            android:id="@+id/horGuideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.47" />
    
        <android.support.constraint.Guideline
            android:id="@+id/horGuideline3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.53" />
    
        <android.support.constraint.Guideline
            android:id="@+id/horGuideline4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.88" />
    
    </android.support.constraint.ConstraintLayout>
    

    因此,您的布局看起来像这样:

    【讨论】:

    • 酷!我不知道这件事。此外,android.support.constraint.Guideline 已替换为 androidx.constraintlayout.widget.Guideline。
    【解决方案4】:

    在这里查看您的图像是您可以做的,使用相对布局并将线性布局放入其中。如果您想让图像视图正确适合,您也可以使用 weightSum。

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"
        android:layout_marginLeft="5dp" >
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:orientation="vertical" >
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:orientation="vertical" >
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
    </RelativeLayout>
    

    【讨论】:

    • 给出精确的边距对于多个屏幕来说不是好方法。这就是为什么我正在寻找百分比解决方案
    • 为您的相对布局设置左右边距将在所有屏幕上设置相同的边距,因为这些值在 dp 中。
    • 但 dp 值对每个密度的影响不同。
    • 这些是与密度无关的像素,根据我在布局中使用 dp 单位的经验,在不同屏幕上的边距方面没有问题。
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多