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

问题描述 投票:11回答:6

我一直在使用一些黑客来扩展父级RelativeLayout中的视图,以便它从左上角开始并以底部中心结束。虽然RelativeLayout确实让你在它自己的中心放置一些东西,但它似乎并没有让你伸展到同一点。

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

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

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

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

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

(我的判断)最明智的建议是我用LinearLayout替换我的View,我认为它会减少一点记忆,即使它稍微少一些。所以我感谢@yorkw。我很惊讶以前没有人问过这件事。

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

Update

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

android android-layout android-relativelayout
6个回答
7
投票

我喜欢你现在的解决方案,但如果你想避免使用时髦的隐形瘦中心小部件,你可以按如下方式完成:

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

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

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

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

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


1
投票

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


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>

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


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,以便隐含其余部分。我在上面添加了一些颜色,这是一张漂亮的照片


1
投票

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


1
投票

您可以使用支持库的PercentRelativeLayout

  1. 将它包含在您的项目中:compile 'com.android.support:percent:23.4.0'
  2. 使用PercentRelativeLayout代替你的RelativeLayout
  3. 使你的按钮的宽度为其父级的50%:app:layout_widthPercent="50%"

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

© www.soinside.com 2019 - 2024. All rights reserved.