11

我一直在使用一些技巧来拉伸父RelativeLayout级内部的视图,以便它从左上角开始并在底部中心结束。虽然RelativeLayout确实可以让您将某些东西定位在其自身的中心,但它似乎并不能让您将某些东西拉伸到同一点。

我的解决方案很简单,在该中心放置一些东西,并给它 1px 尺寸,使其成为 parent 的实际中心RelativeLayout。不要误会我的意思,这是可行的,我对此没有任何问题,但是如果有更好的做法,我想知道它。

至于我在说什么的图形表示,让我添加一些图像来说明。

                                                在此处输入图像描述

第一张图片的中心有一个无文本TextViewRelativeLayout,我给它的宽度是 0dp。正如您在下一张图片中看到的那样,这使我可以相对于该中心放置任何东西。我的观点是,如果不在中心添加额外的视图就无法做到这一点,这让我感到很奇怪,因为我可以看到诸如Layout to left ofor Layout to right ofbut no Layout to center of之类的属性。

                                                 在此处输入图像描述

所以这个场景可能更像是“它还没有坏,但我担心它会随时弹出”。然后另一方面,如果这是正确的做法,并且我帮助某人学习新事物,那也适用于我。

为什么我会问没有得到回答的问题!?我在这里设置赏金..

建议的最明智的事情(根据我的判断)是我LinearLayout用 a替换 my View,我认为它会占用更少的内存,即使它稍微少一点。所以我感谢@yorkw。我很惊讶以前没有人问过这个问题。

只是为了澄清,因为似乎对我实际追求的东西存在误解。我不希望某些东西占据父宽度/高度的一半。我正在寻求一种将其用作参考点的方法(这就是我在标题中所说的),这样我就可以做一些事情,例如将图像定位在中心的左侧,而无需添加占一半的线性布局和左侧的重力管他呢。

更新

从 API 14 开始,我们就有Space了一个轻量级的View子类,可能更适合这种黑客攻击。

4

6 回答 6

7

我喜欢你目前的解决方案,但如果你想避免时髦的隐形薄居中小部件,你可以按如下方式完成:

  • 将 containerWidth 计算为包含 RelativeLayout 派生类的像素宽度(调用此 MyRelativeLayout)
  • 创建一个名为 leftHalfWidgetLayoutParams 的 MyRelativeLayout.LayoutParams 实例
  • 设置 leftHalfWidgetLayoutParams.width = containerWidth / 2,或者在上面创建时使用构造函数参数,或者在事后。如果您想稍后调整它(例如,在 MyRelativeLayout 中的 onSizeChanged() 的覆盖中),则事实是必要的。
  • 每次设置或更改 leftHalfWidgetLayoutParams.width 时,调用 leftHalfWidget.setLayoutParams(leftHalfWidgetLayoutParams)。
  • 如果需要在每次宽度变化时重绘 MyRelativeLayout,请调用 requestLayout()

如果中心右侧的小部件过大,可能还需要明确设置它们的布局宽度值,以防止它们侵入容器的左半部分。

现在我意识到这失去了让 RelativeLayout 自动完成所有事情的一些“魔力”,这就是你的方法实际上更好的地方。但是RelativeLayout仍然会尽可能地强制你的小部件的相对位置,因为你的leftHalfWidget的布局参数中已经添加了宽度的附加约束,所以你不会覆盖或放弃它的整体这方面的贡献。

如果不以上述方式显式设置布局参数的宽度值,我想不出一种方法来满足您在 RelativeLayout 中的要求。这是您的另一种方法,但不一定是更好的方法。

我要指出的是,如果您的左半部分小部件总是占据容器的左半部分,那么我看不出为什么在顶层(权重为 0.5 )有水平 LinearLayout(而不是 RelativeLayout)对于您的左侧大小的小部件,其右侧的右侧相对布局(RelativeLayout)用于剩余的右半部分),这不是一个好的解决方案。在这种情况下,“相对”的东西无论如何只会在右半部分进行,那么当 LinearLayout 可以更简洁地完成工作时,为什么还要在顶层使用 RelativeLayout 呢?但也许您想在左侧使用 RelativeLayout 来处理垂直关系,因此您实际上可能在左侧拥有多个控件。

于 2012-05-30T04:01:31.143 回答
1

为了实现你正在做的事情,我使用了 LinearLayout,layout_width=0dip 和 layout_weight=50。但它不是最优的,因为它在线性布局内嵌套了另一个布局。我很想知道是否有其他更好的解决方案可用。

于 2012-05-25T09:53:54.053 回答
1

That seems kind of wonky. I'd hate to be the guy doing follow up work on that layout. Really though, to address the issue, you should just use a LinearLayout and weights.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ff0000"
    android:weightSum="2" >

    <Button
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="#00ff00"
            android:text="@string/hello" />
</LinearLayout>

you could embed the above into a RelativeLayout as is. Given each direct child of a RelativeLayout has a dev-defined role, it's easy for one to see that a LinearLayout child with fill_parent in both directions is another layer of the RelativeLayout.

You could insert arbitrary, empty, views as noted in another comment with a given layout_weight, or, as I did above, assign a weightSum so the rest is implied. I added some color above and here's a pretty picture

pretty picture

于 2012-06-02T05:25:30.600 回答
1

我认为最好使用LinearLayout。有了'layout_weight'这个属性,我认为LinearLayout可以解决很多问题。使用 LinearLayout 还需要在 LinearLayout 内部有另一个空视图,但我认为它更好,我喜欢 LinearLayout :) 这是我的代码

<LinearLayout android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:background="@drawable/your_image">
    <Button android:layout_height="fill_parent"
        android:layout_width="0dip"
        android:layout_weight="1.0"/>
    <View android:layout_height="fill_parent"
        android:layout_width="0dip"
        android:layout_weight="1.0"
        android:visibility="invisible"/>
</LinearLayout>

最后,对不起我糟糕的英语。

于 2012-05-27T14:39:25.647 回答
1

目前,Android 中没有任何内置功能可以帮助使用布局的中心作为参考点。但是,您可以仅使用上面其他答案中建议的一些扩展和技巧来完成此操作。如果 Android 已经为此提供了一些东西,那么它将执行与其中一些答案相同数量的计算和工作。所以它是一样的,但如果我们内置它肯定会看起来更干净。

于 2012-06-02T18:28:32.883 回答
1

您可以使用支持库的PercentRelativeLayout

  1. 将其包含在您的项目中:compile 'com.android.support:percent:23.4.0'

  2. 使用PercentRelativeLayout代替你的RelativeLayout

  3. 使按钮的宽度为其父级的 50%:app:layout_widthPercent="50%"

新布局看起来快速且易于使用。我认为它唯一真正的缺点是它不能用于主屏幕小部件。

于 2016-05-19T04:27:51.207 回答