如何在不同设备上以编程方式添加大小相同的图标?

时间:2018-12-26 14:36:35

标签: java android

我有两个设备和一个带图标的片段。该图标是通过编程方式添加的,而不是在布局XML文件中添加的。在我的两个Android设备上,此图标显示为完全不同的大小(一个大,另一个小)。

我怀疑这与我指定像素长度的尺寸有关,而不是像通常在布局XML文件中那样指定尺寸像素(dp)-所以我写了一种将像素转换为dp的方法:

public static float pixelsToDp(float pixels, Context context){
    return pixels / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

因此,使用此方法时,尺寸应为dp。这是我用来添加图标的代码:

private void addInfoIcon(Drawable infoIconDrawable) {
    // CONVERT PIXEL SIZE TO DP SIZE
    float infoIconSizeDp = AndroidUtils.pixelsToDp(INFO_ICON_SIZE_PX, getContext());
    final ImageView ivInfoIcon = new ImageView(getContext());
    ivInfoIcon.setLayoutParams(new LayoutParams((int) infoIconSizeDp, (int) infoIconSizeDp));
    ivInfoIcon.setBackground(infoIconDrawable);

    rlInfo.addView(ivInfoIcon);
}

这似乎没有帮助-两种设备上的图标都变小了(如预期),但大小仍然不同。

我在做什么错?感谢任何见解:)

1 个答案:

答案 0 :(得分:1)

通常,您希望将>>> [1,2,2,3]+[1,2,3] [1, 2, 2, 3, 1, 2, 3] >>> [1,2,2,3]-[1,2] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for -: 'list' and 'list' 转换为dp,而不是相反。大多数Android函数都接受px值,而我们习惯用px来考虑尺寸。例如,通常您会在布局文件中指定dp,但是36dp需要使用其参数来使用px单位,因此您需要将36 dp转换为未知数量的px。

LayoutParams转换为dp的正确方法是:

px

但是,更好的方法是创建一个public static int dpToPx(int dp, Context context){ return (int) (dp * context.getResources().getDisplayMetrics().density); } 资源并对其进行访问。这样做意味着系统将自动为您执行dp到px的转换!另外,然后您可以继续使用您熟悉的表示法(例如dimen),因为不需要Java代码即可更改它并很快重新启动应用程序重新编译。

此外,您通常希望将36dp的图像设置为视图的“源”,而不是视图的“背景”(对应于ImageView而不是android:src)。

放在一起,我会用这个:

  • android:background
res/values/dimens.xml
  • 您的Java文件:
<resources>
    <dimen name="info_icon_size">36dp</dimen>
</resources>