Android - ImageView - 多屏幕支持 - 将高度/宽度设置为dp或match_parent / wrap_content?

时间:2015-07-07 21:32:08

标签: android android-layout android-screen-support

我目前正在尝试调整我的Android应用,以便在多个屏幕/设备上看起来和感觉类似。

我现在知道,其中的一个主要部分是根据mdpi,hdpi,xhpi,xxhdpi和xxxhdpi的x1,x1.5,x2,x3,x4比率为每个图像文件提供多个图像尺寸,我今天已经完成了这件事。

执行此操作后,我在@ dimen.xml值资源中定义了Density independent Pixel维度,这些维度与MDPI资源的实际图像大小(以像素为单位)相对应。随后,我将问题的layout_widthlayout_height中的图像视图设置为此维度。

然而,我目前不知道为什么我的应用程序在MDPI仿真器上看起来仍然与在HDPI仿真器上看起来明显不同。为了突出我的意思,我将提供以下屏幕截图,显示HDPI和MPDI仿真器彼此相邻(左边是HDPI(4" WVGA Nexus S),右边是MDPI(5.4" FWVGA))。我希望它们看起来都像MPDI版本,但到目前为止我所做的显然不起作用。

enter image description here enter image description here

我有三种理论可以解释为什么这不符合我的意图:

1。我不应该将ImageView layout_widthlayout_height设置为dp值,而是match_parentwrap_content(? )(并在过程中更改我的.xml布局的结构)。

2. 我不仅要定义多个可绘制资源,还要为不同的屏幕尺寸定义多个布局资源(?)。

3。我误解了这应该如何运作的整个想法(?)。

我还将举例说明第一个屏幕截图中可以看到的列表项之一(@drawable/phone_speed_icon是MPDI中的64 x64像素资源和96x96资源HDPI,@dimen/icon_attribute_size64dp):

        <LinearLayout
            android:id="@+id/llSpeed_PreSession"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingBottom="10dp"
            android:paddingEnd="20dp"
            android:paddingStart="20dp"
            android:weightSum="100">

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="@dimen/icon_attribute_size"
                android:layout_weight="20"
                android:weightSum="100">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="70"
                    android:gravity="center"
                    android:orientation="vertical">


                    <ImageView
                        android:layout_width="@dimen/icon_attribute_size"
                        android:layout_height="@dimen/icon_attribute_size"
                        android:src="@drawable/phone_speed_icon" />

                </LinearLayout>

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="30"
                    android:gravity="center_vertical"
                    android:paddingStart="10dp"
                    android:text="Speed"
                    android:textAppearance="@android:style/TextAppearance.Large"
                    android:textColor="#878787"
                    android:textStyle="bold" />

            </LinearLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="80"
                android:gravity="center">

                <android.support.v7.widget.SwitchCompat
                    android:id="@+id/swSpeed_PreSession"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent" />
            </LinearLayout>

        </LinearLayout>

最后,我有四个问题需要回答:

1. 如何使屏幕截图1中的列表项在MDPI设备上与HDPI设备看起来相同?这与我前面提到的三种理论中的一种有什么关系吗?

2. 为什么标题文字(“你想测量什么?”)包装在一台设备上,而不是另一台设备上?他们使用sp单位(通过android:style/TextApperance.TextApperance.Large)?

3。 HDPI设备(如果有的话)不应该更多地间隔而不是间隔更小? HDPI仿真器看起来好像“可用的像素更少”,如果你能理解我所说的甚至一点点。

4. 如何让第二张截图上的碎片看起来一样?或者我甚至不想要这个,因为HDPI(由于某种原因)在物理上更小,这就是为什么布局不那么分散?

无论如何,我一整天都在这里,而且我读的越多,我得到的就越混乱,所以非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以根据各种因素创建多个dimens.xml文件。在这里,您将根据屏幕宽度了解Android Studio中各种dimens.xml文件的当前项目。

Res values

但是,您可以对所需的每个dimens文件有不同的要求。例如,您可以为每个密度创建dimens个文件:

enter image description here

enter image description here