Android - 如何将视图相对于其父视图的中心/顶部/底部(等等)进行偏移来定位视图?

27

我有一个RelativeLayout,其中的视图相对于它们的父视图进行对齐,例如:

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
textView.setLayoutParams(layoutParams);

现在我想知道,如何将视图相对于其父视图的底部定位,但带有偏移量(例如,在底部上方100像素,距左边20像素等),或者类似地在中心点下方30像素?

schematic image of the necessary layout

我尝试设置View的边距(例如):

layoutParams.setMargins(140, 0, 0, 0);

在将其应用于textView之前,我尝试了许多方法来对齐视图,但都没有成功。

这似乎是一种非常有用的方式,可以为各种屏幕大小对齐视图。

对我来说,重要的是要在代码中实现这一点,而不使用XML。

谢谢!


从XML创建布局,这是创建... - RajaReddy PolamReddy
@PolamReddy 对不起,我不明白。你能换个说法吗? - DannyA
你正在创建动态内容,这有些困难,从XML文件中创建布局将更容易。 - RajaReddy PolamReddy
你能给我一些提示如何在XML布局中实现这个功能吗?我会尝试将其转换为动态版本。谢谢。 - DannyA
您可以在LinearLayout中使用android:paddingBottomandroid:marginTop - onmyway133
2个回答

64

你有两种方法,其中最简单的是使用一个位于中心的锚点空视图。

<View
    android:id="@+id/anchor"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_centerInParent="true" />

<TextView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@id/anchor"
    android:layout_marginBottom="20dp"
    android:text="hello world!"/>

或者你可以将视图居中并使用填充来定位它(必须将填充加倍,因为它会溢出到屏幕中心以下)

 <TextView
     android:id="@+id/imageView1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerInParent="true"
     android:paddingBottom="40dp"
     android:text="hello world!"/>

真是个重生啊 :). 你认为优缺点是什么:锚定方法使用起来可能更容易,但可能会浪费一些CPU/内存资源(使相对布局树变得更大)?此外,我的原始问题需要在代码中完成。除了使用类似layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT,0)之类的东西之外,还有什么需要注意的吗?谢谢! - DannyA
对于一个简单的视图,其中只有几个元素,这个方法非常完美! - Vladimir
我独立想出了完全相同的解决方案,甚至将视图称为“anchor”。唯一的区别是我将锚点的高度设置为“match_parent”,而不是零。使用零有什么优势吗? - F.K. Juliano

0

今晚我开始学习 Android 编程,所以这可能是一个陈旧的或者不好的想法... 但是我正在尝试上述答案并发现把一个元素定位在我的另一个元素下面时会出现问题 - 要么填充会挡住视图,要么其他问题。这是我最终采取的方法。

使用锚定技术,我给锚点也设置了高度(双倍于你需要的高度),然后将我的元素与顶部对齐。那样它就能位于视图的中间减去锚点高度的一半!

<View
    android:id="@+id/anchor"
    android:layout_width="0dp"
    android:layout_height="200dp"
    android:layout_centerInParent="true" />

<TextView
    android:id="@+id/heading"
    android:text="@string/heading"
    android:textColor="@android:color/white"
    android:textSize="24sp"
    android:layout_alignTop="@id/anchor"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/subheading"
    android:text="@string/subheading"
    android:textColor="@android:color/white"
    android:textSize="12sp"
    android:layout_below="@+id/heading"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

另一个答案帮了很多忙,但我只是想提供我的意见!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接