如何使用View的中心作为RelativeLayout中的参考点

时间:2012-05-25 08:47:00

标签: android android-layout android-relativelayout

我一直在使用一些黑客来扩展父RelativeLayout内的视图,以便它从左上角开始并以底部中心结束。尽管RelativeLayout确实可以让您将某些内容置于其中心位置,但它似乎并没有让您将某些内容延伸到同一点。

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

至于我正在谈论的图形表示,让我添加一些图像说明。

enter image description here

第一张图片的文字TextView位于RelativeLayout的中心,我给它的宽度为0dp。这让我可以在下一张图片中看到相对于该中心放置任何东西。我的观点是,如果不需要在中心添加额外的视图就不能这样做,这让我觉得很奇怪,因为我可以看到Layout to left ofLayout to right of等属性没有 Layout to center of

enter image description here

因此,情景可能会更多,“它没有被打破,但我担心它会在任何时候弹出”。另一方面,如果这是正确的做法,我帮助某人学习新事物,那对我也有用。

为什么我会提出无法解答的问题!?我在这里设定赏金..

最明智的建议是(我的判断)是我用LinearLayout取代View,我认为这会占用更少的记忆,即使它稍微少一些。所以我感谢@yorkw。我很惊讶以前没有人问过这个问题。

只是为了澄清,因为似乎对我实际追求的内容存在误解。我不希望某些东西占据父宽度/高度的一半。我想要一种方法将它用作参考点(这就是我在标题中所说的)所以我可以做一些事情,将图像放在中心的左边,而不添加一半的线性布局和重力或者其他什么。

更新

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

6 个答案:

答案 0 :(得分:7)

我喜欢你现在的解决方案,但是如果你想避开那个时髦的隐形瘦中心小工具,你可以按如下方式完成:

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

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

现在我意识到这会让RelativeLayout自动完成所有操作而失去一些“魔力”,这就是你的方法实际上更好的地方。但是,如果增加了对leftHalfWidget布局参数的宽度限制,RelativeLayout仍然会强制执行小部件的相对位置,这样你就不会覆盖或放弃它的整体在这方面的贡献。

我没有想到在RelativeLayout中满足您的要求的方法,而没有以上述方式显式设置布局参数的宽度值。这是你的另一种选择,但不一定是更好的方法。

我会指出如果你的左半部件总是将占用容器的左半部分,那么我看不出为什么是水平的 top 级别的LinearLayout(而不是RelativeLayout)(左侧小部件的权重为0.5,其余右半部分的权重等于RelativeLayout),不会很好解。在这种情况下,“相对”的东西只会在右半边进行,所以为什么在LinearLayout可以更简洁地完成工作时,在顶层使用RelativeLayout?但也许您想在左侧使用RelativeLayout来处理垂直关系,因此您实际上可能在左侧有多个控件。

答案 1 :(得分:1)

为了实现您的目标,我使用LinearLayout,layout_width = 0dip和layout_weight = 50。 但它并不是最佳的,因为它在线性布局中嵌入了另一种布局。我很想知道是否还有其他更好的解决方案。

答案 2 :(得分: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>

最后,抱歉我的英语不好。

答案 3 :(得分:1)

这似乎有些不稳定。我不想成为那个在布局上进行后续工作的人。实际上,要解决这个问题,你应该使用LinearLayout和权重。

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

您可以将上述内容嵌入到RelativeLayout中。鉴于RelativeLayout的每个直接子节点都有一个dev-defined角色,很容易看到两个方向上fill_parent的LinearLayout子节点是RelativeLayout的另一层。

您可以插入具有给定layout_weight的另一条评论中所述的任意空白视图,或者,如上所述,指定weightSum,以便隐含其余部分。我在上面添加了一些颜色,这里是一张漂亮的照片

pretty picture

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您可以使用支持库的PercentRelativeLayout

  1. 将其包含在您的项目中:PercentRelativeLayout

  2. 使用RelativeLayout代替app:layout_widthPercent="50%"

  3. 将按钮的宽度设为其父级的50%:{{1}}

  4. 新布局似乎快速而简单易用。我认为它唯一真正的缺点是它不能用于主屏幕小部件。