两个屏幕,大小相同,密度不同

时间:2016-07-10 14:02:16

标签: android

除密度外,两个屏幕几乎相同:

左侧屏幕是模拟器768x1280 160dpi(MDPI)。 右侧屏幕是模拟器720x1280 320dpi(XHDPI)。

enter image description here

我使用宽度300dp和高度300dp。 XML:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/picture"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:src="@drawable/picture"
        android:layout_centerInParent="true"/>
</RelativeLayout>

无论褶皱/图像质量如何,两个图像都不应该在两个(和其他)屏幕中占据相同的空间?有一个答案证实了这一陈述here

修改 我见过用户说你必须为不同的屏幕复制相同的XML,这样你就可以改变元素的DP值。如果这是真的, 我想我误解了DP单位的目的。我认为它的目的是使用相同的DP值在不同的屏幕上使用完全相同的图像。 你能澄清一下吗?

3 个答案:

答案 0 :(得分:14)

我认为使用仿真器这一事实在这里引起了一些混乱。

如此处指定dp单位,应该意味着图像在不同设备上的物理尺寸大致相同。在你的问题中,你说我们正在比较两个几乎相同大小的屏幕,但事实并非如此!

考虑到你在问题中提出的决议,我们实际上是在左边看一个9英寸的平板电脑,在右边看一个4.5英寸的电话。由于这些是虚拟设备并且可以在屏幕上调整大小,因此它们可以看起来大小相同,但实际上它们代表了截然不同的东西。

在左侧,我们可以从状态栏和系统按钮看到这看起来确实像平板电脑,我在状态栏中使用了图标作为比例的粗略衡量标准:

enter image description here

这预示着如果你真的在你面前有一台平板电脑和手机(或仿真器的比例正确),那么两者的图像尺寸将是相同的。

编辑 - 回复此答案评论的其他详细信息:

在dp中描述大小的目的是在具有不同像素密度的设备上它们将具有相同的物理尺寸。这就是你上面所做的。例如,如果元件每侧2英寸,那么在高分辨率或低分辨率手机上它将是2英寸,在高分辨率或低分辨率平板电脑上它将是2英寸。

如果您想要的不是元素与实际尺寸相同,而是始终与屏幕的比例相同(就像屏幕宽度的90%一样)那么有几种类型的布局你可以选择。

LinearLayout使用权重的概念来分配不同比例的空间。

支持库包含PercentRelativeLayout and PercentFrameLayout,其工作方式与常规布局类似,但允许您使用百分比指定大小。

The new ConstraintLayout目前仅适用于Android Studio 2.2预览版。我自己还没有使用它,但似乎它包含了它自己的比例和基于百分比的概念,这也可以实现这一点。

答案 1 :(得分:2)

您也可以在编程中执行此操作,因此对于不同的屏幕尺寸(也适用于不同的密度),您可以通过获取屏幕尺寸然后计算像素数(以百分比计)来设置图像大小百分比)像这样宽度和高度都需要。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout_xml);

    DisplayMetrics metrics = getResources().getDisplayMetrics();
    int screenWidthInPixels = metrics.widthPixels;
    int screenHeightInPixels = metrics.heightPixels;

    int imageWidth = Math.round (screenWidthInPixels * (58.57/100)); //58.57 is the percentage value for image width
    int imageHeight = Math.round (screenHeightInPixels * (58.57/100)); //58.57 is the percentage value for image height

    ImageView picture= (ImageView)findViewById(R.id.your_image_id);
    picture.setLayoutParams(new RelativeLayout.LayoutParams((int) imageWidth , (int) imageHeight ));


    }

答案 2 :(得分:0)

简单澄清:

第一个屏幕,160 [MDPI]:

这里1 dp [在xml的ImageView宽度中使用] = 1像素[px]。因为它是Android的规格。 因此,图像在宽度和高度上都以完整的300像素显示。

第二个屏幕,320 [XHDPI]:

这里1 dp [在xml的ImageView宽度中由你使用] = 2像素[px]。

正如您在宽度和高度上使用“300dp”,意味着您要求Android使用“密度像素”[dp]而不是物理像素[px]。

所以,300 dp = 600像素[px]

这就是为什么ImageView在第二个模拟器中具有双倍大小的原因。

希望,这让人怀疑。

<强>解决方案:

如果你想让你的ImageView具有相同的宽度和高度,那么你可以在android:width和android:height中使用 android:weight 属性。这将在您的imageview两侧分配相等的空间。

在运行时查找密度的示例代码:

private static String getDensityName(Context context){
    float density = getResources().getDisplayMetrics().density;

    if(density >= 4.0){
        return “xxxhdpi”;
    }
    if(density >= 3.0){
        return “xxhdpi”;
    }
    if(density >= 2.0){
       return “xhdpi”;
    }
    if(density >= 1.5){
       return “hdpi”;
    }
    if(density >= 1){
       return “mdpi”;
    }
    return “ldpi”;

}