Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过编程在不同的设备上添加相同大小的图标?_Java_Android - Fatal编程技术网

Java 如何通过编程在不同的设备上添加相同大小的图标?

Java 如何通过编程在不同的设备上添加相同大小的图标?,java,android,Java,Android,我有两个设备和一个带有图标的片段。此图标是以编程方式添加的,而不是在布局XML文件中添加的。在我的两台Android设备上,这个图标显示为完全不同的大小(一个大,另一个小) 我怀疑这与我以像素长度指定尺寸有关,而不是像我们通常在布局XML文件中那样指定尺寸像素(dp)——因此我编写了一个将像素转换为dp的方法: public static float pixelsToDp(float pixels, Context context){ return pixels / ((float) c

我有两个设备和一个带有图标的片段。此图标是以编程方式添加的,而不是在布局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转换为未知数量的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);
}