【问题标题】:Supporting multiple screen size - Android支持多种屏幕尺寸 - Android
【发布时间】:2013-11-21 14:49:19
【问题描述】:

我打算在 Android 中开发新的应用程序。此应用程序只能纵向工作(即使对于平板电脑也是如此)。此外,手机和平板电脑上的 UI 和布局设计应该是相似的。我们无法更改平板电脑的布局设计,因为它有很大的使用面积。我们必须拉伸所有图像以匹配手机。我们可以使用九个补丁。但我对在多个可绘制对象中使用图像有点困惑。

根据我的分析(可能是错误的.. : ))屏幕分为密度和尺寸。我们可以使用 3:4:6:8 的缩放比例。但是这个比率是基于密度的。但就我而言,我必须拉伸整个 UI 以填充平板电脑屏幕。

那么什么是可用于像这样可以支持多个设备的应用程序的可绘制对象。我们必须设计的屏幕尺寸是多少。

而且这个应用程序需要近 100 个布局。所以我打算保持单一布局并使用每个布局的重量而不是使用尺寸来设计布局。

另外,如果我使用多个 APK 来支持不同的屏幕尺寸,那么用于支持的可绘制对象是什么 1.小而正常 2.大 3. 超大

【问题讨论】:

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


【解决方案1】:

我刚刚做了一些非常相似的事情。为了在不创建新布局的情况下扩展应用程序,我使用了 XML 中设置的尺寸

res/values/dimensions.xml
res/values-sw600dp/dimensions.xml -> 7+ inches
res/values-sw720dp/dimensions.xml -> 10+ inches

维度是资源文件:

<dimen name="default_padding">11dp</dimen>

在 600 和 720 文件中,您可以将尺寸增加约 30%。 然后在你的布局中简单地使用@dimen/default_padding,它就会被缩放

关于图像,要么确保你拥有所有密度的所有资产,要么为你设置固定大小ImageView's 和适当的scaleType

【讨论】:

  • 这对我不起作用。无论如何,总是使用 values 文件夹。是否有可以查看其他价值桶的属性?
【解决方案2】:

首先,您不想创建多个 APK 来支持多种屏幕密度。 Android 提供了您需要的所有框架来支持一次构建中的所有内容,您只需创建具有所需密度的正确资源层次结构可绘制对象。

那么你到底需要什么...根据你的问题如下:

  • 纵向模式:您可以在 AndroidManifest 文件中声明的每个 Activity 中指定此模式,方法如下:

    <activity android:name=".MainActivity" 
        android:label="@string/app_name"
        android:configChanges="orientation" > 
        ...
    </activity>
    

    注意:根据 Android docs,如果您的目标 API >= 13,并且您使用 android:configChanges 属性,您还应该使用 android:screenSize 属性来帮助指定大小更改。

  • 各种屏幕的尺寸:如前所述,这也可以在资源中处理。这是使用一个通用布局文件但配置布局以在众多设备上使用的最佳方式。如果您不熟悉如何使用维度,请参阅http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

  • drawables:听起来这是您问题的症结所在。正如您所提到的,使用九个补丁将帮助您减少应用程序占用空间并填充额外空间(有关九个补丁的更多信息,请参阅herehere)。您应该支持的尺寸和这些尺寸所需的密度在 Android 设计文档中进行了详细讨论,如此之多的细节我什至无法在此处重新散列。我在下面提供了指向我记得讨论过的尽可能多的地方的链接。

祝你好运!

以下是您会发现有用的 Android 设计文档的链接(其中一些已被提及):

【讨论】:

    【解决方案3】:

    除了像素密度特定文件夹外,您还可以指定屏幕大小特定文件夹

    drawable/
    drawable-large/
    drawable-xlarge/
    
    drawable-hdpi/
    drawable-large-hdpi/
    drawable-xlarge-hdpi/
    
    drawable-xhdpi/
    drawable-large-xhdpi/
    drawable-xlarge-xhdpi/
    

    因此,您可以为各种屏幕尺寸和密度设计适当的图形。请注意,给定的屏幕尺寸类别(例如“大”)只会让您大致了解设备的实际设备像素尺寸,但您将获得有关最小/最大 dp 范围的良好指南。

    例如,您可能想要在手机上显示 100x100 的图像(屏幕尺寸“正常”),您需要分别为 drawable、drawable-hdpi、drawable-xhdpi 文件夹创建 100x100、150x150、200x200 的图像资源.但是在 7 英寸平板电脑(即“大”屏幕尺寸的设备上,您可能会以 200x200 显示相同的图像,因此您的“drawable-large”文件夹资源将为 200x200、300x300、400x400,而在 10 英寸平板电脑上,即“xlarge”屏幕,您可能会以 300x300、450x450、600x600 显示相同的图像,因此这些图像位于“drawable-xlarge-*”文件夹中。

    所有细节都在这里:

    http://developer.android.com/guide/practices/screens_support.html

    【讨论】:

    • “一组四种通用尺寸:small、normal、large 和 xlarge”
    【解决方案4】:

    首先你需要所有可能的屏幕布局

    drawable
    drawable-ldpi
    drawable-mdpi
    drawable-hdpi 
    drawable-xhdpi   
    drawable-xxhdpi // phones like s4  
    drawable-xlarge
    drawable-tvdpi  // nexus 7 etc 
    drawable-xlarge-xhdpi //tablet like nexus 10  
    
    layout : for phone 
    layout-sw600dp
    layout-sw720dp
    

    然后您需要将所有使用 9-patch 的图像用于按钮等...您还可以使您的自定义 drawable 可以轻松方便地处理..您还可以使用 switch 为每个屏幕获取 dpi 和相应地缩放布局。

    因为,在我的一个项目中,我使用这种技术向每个分辨率设备显示各自的东西。

    DisplayMetrics metrics = getResources().getDisplayMetrics();
    
    int densityDpi = (int) metrics.density ;
    switch (densityDpi) {
         case (int) 1.5: 
             break;
    
         case (int) 2: //1.75 will be 2 in INT.
             break; 
    
         default:
             break;
    }
    

    还保留您将用于边距填充的所有值等 values-sw600dp 用于 tvdpi 平板电脑,value-sw720dp 用于平板电脑

    最后但并非最不重要的一点是,尽可能保持所有东西的通用性并将其放入可绘制的.. 我见过一些使用不同 dpi 的背景图案并将其放在各自的可绘制对象中的 ppl 这将节省你的时间..希望它可以帮助你

    【讨论】:

    • 对不起,你为什么要在 switch case 中将浮点数作为整数处理?!加上 1.75 不会是 2 隐式转换...它将是 1,就像 1.5...
    • 是的,你是对的@WarrenFaith 我忘了在其中使用 math.ceil,我刚刚给出了他们如何解决问题的想法。就浮点数而言,我使用它是因为 Android dpi 是小数,但我需要根据设备密度在某些按钮中设置填充,所以我需要将其转换为 int ..
    • 即使使用 ceil 您也不应该将特定的浮点值转换为 int 以便您可以使用开关/案例。通常你应该只实现一个 if/else 结构。将比仅用于开关盒的一些浮点/整数魔术更清洁...
    【解决方案5】:

    要拉伸所有图像以匹配手机,您可以使用sdp size unit 指定图像大小。此尺寸单位是相对于屏幕尺寸而言的,因此可以满足您的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多