将元素放在 RelativeLayout 中背景的某些点上

put the Element on certain points on the background in a RelativeLayout

我有一张图片,我想在不同设备的某个点(棕色矩形上)放一个TextView屏幕尺寸。我的图片如下:
注意ImageView 的 scaleType 是 CenterCrop

在下图中,我显示了我想要放置 TextView 的位置:

这是我的 xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/startpage"<!-- my background-->
        android:scaleType="centerCrop"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="#fff"/>
</RelativeLayout>

有很多选项可以做到这一点,但看到你的照片我只是让我的 TextView 与左上角对齐并将其布局边距设置为 dp 中的正确值(我会在任何图形程序中简单地弄清楚)。

有几种方法。我很新,所以有更多知识的人很可能会有更好的答案。但是,您可以尝试与相对布局对齐。或者您可以使用布局引力来更改它,使其 "gravitates" 朝向您想要的位置。

我建议您也从 draw 9-patch 开始,这是一个可以帮助您 select 您希望内容适合图片的哪个位置的工具。

The Draw 9-patch tool is a WYSIWYG editor that allows you to create bitmap images that automatically resize to accommodate the contents of the view and the size of the screen.

之后您将需要检查对齐方式等。比如左上角,padding-top...等等

最后,我自己找到了,看到这些java代码:
我找到显示的宽度和高度,然后计算比例,根据比例我缩放边距。

@Bind(R.id.name_tv)TextView nameTV;

public final static float bgWidth = 768;
public final static float bgHeight = 1136;

public float tVsRightMargin = 123;
public float nameTVtopMargin = 314;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ResourceManager.setActivity(this);
setContentView(R.layout.main);
ButterKnife.bind(this);

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int displayWidth = displayMetrics.widthPixels;
int displayHeight = displayMetrics.heightPixels;
Log.v("MainActivity","displayWidth: "+displayWidth);
Log.v("MainActivity", "displayHeight: " + displayHeight);

float scale = Math.max(displayWidth/bgWidth, displayHeight/bgHeight);
Log.v("MainActivity", "scale: "+scale);

float bgScaledWidth = scale*bgWidth;
float bgScaledHeight = scale*bgHeight;

tVsRightMargin *= scale;
nameTVtopMargin *= scale;

if(bgScaledWidth>displayWidth) {
    tVsRightMargin -= ((bgScaledWidth - displayWidth) / 2f);
}
if(bgScaledHeight>displayHeight){
    nameTVtopMargin -= ((bgScaledHeight-displayHeight)/2f);
}

nameTV.setText("محمد");
nameTV.setTypeface(ResourceManager.getTypeface());


Log.v("MainActivity", "top margin: " + nameTVtopMargin);
Log.v("MainActivity", "right margin: " + tVsRightMargin);
((RelativeLayout.LayoutParams) nameTV.getLayoutParams()).setMargins(0, (int) nameTVtopMargin, (int) tVsRightMargin, 0);

}