您好我有一个包含应用程序图标的可绘制对象。应用程序图标存储在runtime
进程中的可绘制对象中,然后使用ImageView
设置该可绘制对象。但是应用程序图标的大小会根据我的应用程序运行的设备而改变。我已将xml中imageView
的宽度和高度设置为50dp,并且还使用了此代码:
image.setAdjustViewBounds(true);
image.setMaxHeight(50);
image.setMaxWidth(50);
image.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
但它没有工作。所以如何为我的imageView
设置最终大小(50dp),以便它可以在任何Android设备屏幕上显示相同的大小。
答案 0 :(得分:0)
在xml
文件中设置宽度和高度就足够了。您不需要以编程方式设置它。
如果像这样设置宽度和高度
image.setMaxHeight(50);
image.setMaxWidth(50);
值50以像素为单位,而不是dp。大小为50x50像素的图像在不同设备中看起来会有所不同,因为这些设备具有不同的dpi。
项目中有文件夹mdpi,hdpi,xhpdi和xxhdpi。 如果要以50dp显示图像,则必须生成不同的文件:
这是因为在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
中设置了height
和pixels
。对于不同的设备,因为结果会发生变化,因此您需要在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());