我有两个设备和一个带有图标的 fragment 。该图标是以编程方式添加的,而不是在布局 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);
}
这似乎没有帮助 - 两个设备上的图标都变小了(如预期),但大小仍然不同。
我做错了什么?感谢任何见解:)
最佳答案
通常,您希望将 dp
转换为 px
,而不是相反;大多数 Android 函数都接受 px
值,并且我们习惯于用 dp
来考虑尺寸。例如,通常您会在布局文件中指定 36dp
,但是 LayoutParams
需要其参数来使用 px 单位,因此您需要将 36 dp 转换为未知数量的 dp。像素。
将dp
转换为px
的正确方法是这样的:
public static int dpToPx(int dp, Context context){
return (int) (dp * context.getResources().getDisplayMetrics().density);
}
但是,更好的方法是创建一个 dimen
资源并访问它。这样做意味着系统将自动为您执行 dp 到 px 的转换!另外,您可以继续使用您熟悉的符号(例如 36dp
),并且您可以更改它并很快重新启动应用程序,因为没有 Java代码需要重新编译。
此外,您通常希望将 ImageView
的图像设置为 View 的“源”,而不是 View 的“背景”(对应于 android:src
android:background
)。
放在一起,我会用这个:
res/values/dimens.xml
:
<resources>
<dimen name="info_icon_size">36dp</dimen>
</resources>
- 你的java文件:
private void addInfoIcon(Drawable infoIconDrawable) {
int infoIconSizePx = getResources().getDimensionPixelSize(R.dimen.info_icon_size);
final ImageView ivInfoIcon = new ImageView(getContext());
ivInfoIcon.setLayoutParams(new LayoutParams(infoIconSizePx, infoIconSizePx));
ivInfoIcon.setImageDrawable(infoIconDrawable);
rlInfo.addView(ivInfoIcon);
}
关于java - 如何以编程方式在不同设备上添加相同大小的图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53933452/