Java 如何通过编程在不同的设备上添加相同大小的图标?
我有两个设备和一个带有图标的片段。此图标是以编程方式添加的,而不是在布局XML文件中添加的。在我的两台Android设备上,这个图标显示为完全不同的大小(一个大,另一个小) 我怀疑这与我以像素长度指定尺寸有关,而不是像我们通常在布局XML文件中那样指定尺寸像素(dp)——因此我编写了一个将像素转换为dp的方法:Java 如何通过编程在不同的设备上添加相同大小的图标?,java,android,Java,Android,我有两个设备和一个带有图标的片段。此图标是以编程方式添加的,而不是在布局XML文件中添加的。在我的两台Android设备上,这个图标显示为完全不同的大小(一个大,另一个小) 我怀疑这与我以像素长度指定尺寸有关,而不是像我们通常在布局XML文件中那样指定尺寸像素(dp)——因此我编写了一个将像素转换为dp的方法: public static float pixelsToDp(float pixels, Context context){ return pixels / ((float) c
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转换为未知数量的px
将dp
转换为px
的正确方法如下:
public static int dpToPx(int dp, Context context){
return (int) (dp * context.getResources().getDisplayMetrics().density);
}
然而,更好的方法是创建一个dimen
资源并访问它。这样做意味着系统将自动为您执行dp到px转换!此外,您还可以继续使用您熟悉的符号(例如,36dp
),并且您可以更改它并很快重新启动应用程序,因为无需重新编译Java代码
此外,您通常希望将ImageView
的图像设置为视图的“源”,而不是视图的“背景”(对应于android:src
,而不是android:background
)
总而言之,我会用这个:
:res/values/dimens.xml
你需要这些图标在不同的设备(不同的密度)上以相同的像素大小显示吗?
<resources>
<dimen name="info_icon_size">36dp</dimen>
</resources>
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);
}