在 XML 中或以编程方式创建视图之间的位置差异

Positional differences between creating views in XML or programatically

我在创建一种视图时遇到了问题。假设我正在尝试创建类似于时钟的东西。这意味着我们必须将数字放置在距中心一定距离和角度的位置。

我试图模仿一种定位两个元素的方法。一个中心 ImageView 和一个时钟编号。在 XML 我有类似的东西:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lyt_rootView"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/ivCenter"
        android:background="@drawable/cid"/>

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/ivNumber"
        android:background="@drawable/add_big"
        android:layout_marginLeft="-50dp"
        android:layout_marginTop="50dp"/>

</RelativeLayout>

它工作得很好,图像设置为它们应该的样子,第一个图像完全居中 (ivCenter) 并从中心留出一些边距用于定位第二个图像。

现在我必须以编程方式执行相同的操作,以便我可以创建大量模拟数字的 imageView。所以我有这个代码:

RelativeLayout lyt = (RelativeLayout) findViewById(R.id.lyt_rootView);
int avatarSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 70, getResources().getDisplayMetrics());
int distance = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());

// center image
ImageView ivImageCenter = new ImageView(this);
ivImageCenter.setImageResource(R.drawable.cid);
RelativeLayout.LayoutParams lp = new     RelativeLayout.LayoutParams(avatarSize,avatarSize);
lyt.addView(ivImageCenter, lp);


// first image (simulating a number in a clock)
ImageView ivNumber1 = new ImageView(this);
ivNumber1.setImageResource(R.drawable.add_big);
RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(avatarSize,avatarSize);
lp2.setMargins(distance, distance, 0, 0);
lyt.addView(ivNumber1, lp2);

但结果与 XML 示例不同。我不明白我错过了什么。以编程方式创建视图的结果是,两个 imageView 试图定位在屏幕的中心 space,从而使第一张图像不在屏幕中心。

我错过了什么?

最后我解决了这个问题,方法是创建一个以 XML 为中心的单像素布局作为参考,并以编程方式在该参考视图中添加视图。