Android不同的屏幕尺寸/ dpi,工作量较少

时间:2017-02-23 14:38:25

标签: android compatibility resolution screen-size mobile-devices

嗯,很遗憾,当我的应用已经完成并且功能齐全时,我会遇到不同的屏幕尺寸。

我找到了关于不同设备/分辨率/ dpi实现的千个答案,我试图从每个设备中学到一些东西。

我的目标是不使用不同的密度文件夹,而是为每个布局分辨率/ dpi调整现有图片的大小/重新定位。由于调整大小而导致的图片模糊不清对我来说并不重要。我的应用程序是一个学校项目,我需要在几天内启动它。

我的想法是创建一组巨大的布局文件夹,如:

layout-normal-mdpi    
layout-normal-hdpi
layout-normal-xhdpi
layout-normal-xxhdpi
layout-normal-xxxhdpi
layout-large-mdpi
layout-large-hdpi
layout-large-xhdpi
layout-large-xxhdpi
layout-large-xxxhdpi
layout-xlarge-mdpi
layout-xlarge-hdpi
layout-xlarge-xhdpi
layout-xlarge-xxhdpi
layout-xlarge-xxxhdpi

在此处复制/粘贴我的活动,并使用所需的DP值设置每个活动对象,以使应用程序在大多数设备上可用/可查看。

在此之后,我将创建尽可能多的虚拟设备来正确测试和编辑图形。

再次,我通过这种方式失败了(除了优质的DPI分辨率)?

您是否有更好的想法让我的应用与大多数设备兼容?

我的应用程序大部分都是以平板电脑为目标,我想让它与4英寸以上的手机兼容。

上一个问题:

使用像我这样的密度值:

layout-normal -hdpi

是一个很好的实践?它将在未来的Android版本中实现吗?或者最好避免像我们这样的DPI值:

布局正常

非常感谢您的帮助。

这是我作为Galaxy S7 Edge创建的虚拟设备的屏幕截图。它加载 layout-normal-xxxhdpi 布局。

enter image description here

3 个答案:

答案 0 :(得分:2)

我建议您不要创建所有这些布局,但要创建不同的dimens.xml文件,这样您就必须创建一个布局,每个视图都有一个大小属性,Android会根据设备屏幕尺寸自动生成。 这是一个例子:

布局:

<ImageView
        android:id="@+id/image_cat"
        android:layout_width="@dimen/width_category_image_carousel"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:foregroundGravity="center_horizontal|bottom" />

sw300dp的文件DIMENS.XML(这表示最小宽度,无论方向,都必须为300dp)

<resources >
    <dimen name="width_category_image_carousel">220dp</dimen>
</resources>

您必须根据要支持的不同大小的屏幕在资源目录的values目录中创建更多文件dimens.xml。 您可以在此处找到有关如何定义不同尺寸的更多信息: https://developer.android.com/guide/practices/screens_support.html#NewQualifiers

答案 1 :(得分:0)

  

再好吧,我正在以这种方式失败(除了优质的DPI   分辨率)?

布局可能完全不同。某些视图可能不在屏幕上。某些文字可能不包含在其布局中。当然,ImageViews会被拉伸。

  

您是否有更好的想法让我的应用与大多数设备兼容?

是。您可以根据layout_weight属性构建布局。

https://developer.android.com/guide/topics/ui/layout/linear.html

这适用于LinearLayout,但也可以稍微不同的方式使用RelativeLayout。 此属性的目标是为布局内的每个视图提供总大小的一定百分比。

使用的例子。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="1" />

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="2" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="3" />

    </LinearLayout>

通过这种方式,您可以构建UI,使其适应每种屏幕尺寸和密度。

但要小心,有关于使用此属性的警告。如果您使用具有layout_weight属性的嵌套布局,则渲染视图的效果将显着降低。

Why are nested weights bad for performance? Alternatives?

答案 2 :(得分:0)

假设您关注的图像质量因为根据可用空间调整大小,我会执行以下操作:

  1. 我会将这些图像放在res / drawable-nodpi中,例如image1_360.png,image1_540.png,image1_720.png,image1_1080.png如果你的图像应该适合设备宽度。
  2. 在res / values中,我将创建一个drawables.xml文件:

    <drawable name="image1">@drawable/image1_360</drawable>
    
  3. 在values-hdpi中,我会用

    替换该图像
        <drawable name="image1">@drawable/image1_540</drawable>
    

    ,类似于xhdpi和xxhdpi

    1. 在values-w600dp中,我会用

      替换该图像
      <drawable name="image1">@drawable/image1_540</drawable>
      
    2. 并且类似地用于更高密度的桶

      1. 在values-w720dp中,我会用

        替换该图像
        <drawable name="image1">@drawable/image1_720</drawable>
        
      2. 和值-w720dp-hdpi with

            <drawable name="image1">@drawable/image1_1080</drawable>
        
        1. 在values-w1000dp中,我会用

          替换该图像
          <drawable name="image1">@drawable/image1_1080</drawable>
          
        2. 这可能会根据您的实际需要而有所不同,但我们的想法是将值文件夹用于不同的屏幕尺寸&amp;密度桶组合,并使用可绘制的XML标记引用drawable。