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

标签 java android

我有两个设备和一个带有图标的 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/

相关文章:

java - for 循环是导致此代码中错误的原因吗?

Java Swing - 获取包含其他元素的元素的大小

java - Hibernate 5. 将 SQL DDL 生成到文件中

java - 安卓 : How to check if user clicks different key from edittext digits?

android - 按下主页按钮时运行哪个方法?

android - 解决 Android Studio 经常卡顿的问题

java - 与 ArrayList 结合使用时可搜索的 ListView

android - 具有相同图像资源的 BitmapFactory.decodeStream 和 BitmapFactory.decodeFile 行为

android - DialogFragment 与 Activity

android - 从另一个线程更新 UI 时 View.GONE 与 View.INVISIBLE