如何为imageView设置最终大小(50dp),使其在任何Android设备屏幕上看起来都相同

时间:2016-09-09 08:43:44

标签: android

您好我有一个包含应用程序图标的可绘制对象。应用程序图标存储在runtime进程中的可绘制对象中,然后使用ImageView设置该可绘制对象。但是应用程序图标的大小会根据我的应用程序运行的设备而改变。我已将xml中imageView的宽度和高度设置为50dp,并且还使用了此代码:

image.setAdjustViewBounds(true);
        image.setMaxHeight(50);
        image.setMaxWidth(50);
        image.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

但它没有工作。所以如何为我的imageView设置最终大小(50dp),以便它可以在任何Android设备屏幕上显示相同的大小。

3 个答案:

答案 0 :(得分:0)

xml文件中设置宽度高度就足够了。您不需要以编程方式设置它。

如果像这样设置宽度和高度

image.setMaxHeight(50);
    image.setMaxWidth(50);

值50以像素为单位,而不是dp。大小为50x50像素的图像在不同设备中看起来会有所不同,因为这些设备具有不同的dpi。

项目中有文件夹mdpi,hdpi,xhpdi和xxhdpi。 如果要以50dp显示图像,则必须生成不同的文件:

  • 图片大小50x50像素(像素)在文件夹mdpi
  • 图片大小75x75 px in hdpi文件夹
  • xhdpi文件夹中的图像大小100x100像素
  • 图片大小150x150像素夹在文件夹xxhdpi

这是因为在mdpi 1 px = 1 dp,hdpi 1dp = 1.5 px,xhdpi 1dp = 2px和xxhdpi 1dp = 3px

更新您只需生成一张尺寸为150x150像素的图片并将其放入xxhdpi文件夹即可。应用程序将自动缩放您的图像以适应其他密度。

答案 1 :(得分:0)

通过

image.setMaxHeight(50);
image.setMaxWidth(50);

您在width中设置了heightpixels。对于不同的设备,因为结果会发生变化,因此您需要在density independent pixels(dp)中设置这些值。根据设备dp,使用以下方法将您的单位从pixels转换为density

public final class DimensionUtils {

    private static boolean isInitialised = false;
    private static float pixelsPerOneDp;

    // Suppress default constructor for noninstantiability.
    private DimensionUtils() {
        throw new AssertionError();
    }

    private static void initialise(View view) {
        pixelsPerOneDp = view.getResources().getDisplayMetrics().densityDpi / 160f;
        isInitialised = true;
    }

    public static float pxToDp(View view, float px) {
        if (!isInitialised) {
            initialise(view);
        }

        return px / pixelsPerOneDp;
    }

    public static float dpToPx(View view, float dp) {
        if (!isInitialised) {
            initialise(view);
        }

        return dp * pixelsPerOneDp;
    }
}

答案 2 :(得分:0)

您可以使用TypedValue根据提供的px获取dp值:

int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DP, 50, getResources().getDisplayMetrics());