如何使用对所有设备看起来都相同的边距定位视图?

How to position the view with margin that will look same for all devices?

我试图通过以编程方式添加 130(顶部边距)来将视图放置在中心以使其看起来不错,但是,我不确定如何给其他 android 设备,例如平板电脑看起来一样吗?在正常 android phone 上,将 margin-top 添加 130 看起来不错,但在平板电脑上看起来会有所不同。我将如何制定逻辑来提供在所有设备上提供相同外观的边距顶部?一些例子或提示会很棒!我很想听听你的消息!

margin_top = 130 // How to make this look good on all devices? 

ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(0, margin_top, 0, 0);
v.requestLayout();

我的处理方法如下:

1).获取设备高度。还要检查 this 答案。

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;

2).计算比例。

我假设您设置了 130dp 的上边距。使用 pixplicity 我设法将其转换为 px.

您的 phone 分辨率高度 x 重量(以像素为单位)。让我们将高度定义为 phoneHeight.

这里对我来说也有点棘手。如您所见,130dp 对 ldpi、mdpi 等具有不同的像素值。我个人不知道应该使用哪个,您可以尝试使用 mdpi。 (我会尝试进行更多研究并返回答案)。

LE:

您可以使用此方法根据您的phone将dp转换为像素。 (参见 this 回答)。

public static float convertDpToPixel(float dp, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return px;
}

将返回的像素用于下面的公式。 (我们称返回的 px - convertedPx.

3).上边距值的公式。

如果我们使用 table 中的 130dp 值作为 mdpi,我们将得到 130px。所以公式是:

margin_top = (convertedPx / phoneHeight) * height

phoneHeight 您当前正在测试的 phone 的高度和 height 使用 displayMetrics 的设备的高度。

注意: convertedPx 将是一个常量。您只需 运行 在 phone 上使用此方法 (convertDpToPixel) 即可找出 130dp 的像素数。