如何为android中每个不同的屏幕尺寸定义dimens.xml?

Posted

技术标签:

【中文标题】如何为android中每个不同的屏幕尺寸定义dimens.xml?【英文标题】:How to define dimens.xml for every different screen size in android? 【发布时间】:2015-12-27 22:16:04 【问题描述】:

Android 中支持不同的屏幕尺寸(密度)时,重点通常是为每个可能的屏幕创建不同的布局。即。

ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi

我为 xhdpi 屏幕设计了一个布局作为参考,并在 dimens.xml 中定义了它的 dimensions >。现在我想为所有可能的屏幕尺寸提供支持。我该怎么做?

据我所知,我可以使用this 工具找出适合其他屏幕尺寸的 dimens.xml 并将其添加到我的项目中。在我的情况下,这是正确的做法吗?

另一个问题,我只需要为以上屏幕尺寸创建 dimens.xml 吗?如果是,那么 w820dp 是什么?

感谢您的帮助。我需要仅支持手机(不支持平板电脑或其他设备)。

【问题讨论】:

是的,您必须为不同的分辨率创建不同的dimesn.xml 文件。 @PiyushGupta 这将适用于所有上述维度屏幕?但是W820dp 是什么,它支持不同的android 版本吗?另外你能建议我任何关于基于dimens.xml支持不同屏幕的教程吗? 它适用于平板电脑或其他人。否则,正如我所说,您需要创建一个不同的值文件夹。 【参考方案1】:

您必须为不同的屏幕创建不同的值文件夹。 喜欢

values-sw720dp          10.1” tablet 1280x800 mdpi

values-sw600dp          7.0”  tablet 1024x600 mdpi

values-sw480dp          5.4”  480x854 mdpi 
values-sw480dp          5.1”  480x800 mdpi 

values-xxhdpi           5.5"  1080x1920 xxhdpi
values-xxxhdpi           5.5" 1440x2560 xxxhdpi

values-xhdpi            4.7”   1280x720 xhdpi 
values-xhdpi            4.65”  720x1280 xhdpi 

values-hdpi             4.0” 480x800 hdpi
values-hdpi             3.7” 480x854 hdpi

values-mdpi             3.2” 320x480 mdpi

values-ldpi             3.4” 240x432 ldpi
values-ldpi             3.3” 240x400 ldpi
values-ldpi             2.7” 240x320 ldpi

欲了解更多信息,您可以访问这里

Different values folders in android

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

编辑 @humblerookie

您可以使用名为 Dimenify 的 Android Studio 插件根据自定义比例因子自动生成其他像素桶的尺寸值。它仍处于测试阶段,请务必将您遇到的任何问题/建议通知开发人员。

【讨论】:

不应该有 "values-sw480dp-hdpi" .xhdpi 和 xxhdpi 等等吗?只有320dp在你的回答中有这样的..请回复 @IntelliJAmiya:你应该提到 Android 3.2 之间的区别。 @IntelliJAmiya 我创建了一个名为 Dimenify 的工作室插件。这使您可以轻松地为其他存储桶创建维度。你可以添加一个相同的编辑,以便其他人可以使用它吗? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify 这个 Dimenify 是一个很棒的工具 如果我们只创建 values-sw320dp、values-sw600dp...等等而不是 values-sw320dp-xhdpi、values-sw320dp-hdpi、values-sw320dp-mdpi,会有很大的不同吗? values-swXXXdp 末尾的后缀 mdpi/hdpi/xhdpi 有那么重要吗?【参考方案2】:

使用Scalable DP

虽然理论上为不同的屏幕尺寸制作不同的布局是个好主意,但要适应所有屏幕尺寸和像素密度可能会变得非常困难。如上述答案中所建议的那样,拥有超过 20 个不同的 dimens.xml 文件根本不容易管理。

如何使用:

使用sdp

    在您的build.gradle 中包含implementation 'com.intuit.sdp:sdp-android:1.0.5'

    将任何dp 值(例如50dp)替换为@dimen/50_sdp,如下所示:

    <TextView
     android:layout_
     android:layout_
     android:text="Hello World!" />
    

工作原理:

sdp 随屏幕大小缩放,因为它本质上是一个巨大的列表,包含每个可能的 dp 值的不同 dimens.xml

实际操作:

这是在屏幕尺寸和密度大不相同的三款设备上:

请注意,由于某些性能和可用性限制,sdp 大小单位计算包含一些近似值。

【讨论】:

非常感谢。这对我来说真的很有用。 @Advait 你能告诉我我应该为配备 5.5 英寸手机和 2560x1440 分辨率的三星 Edge 7 使用哪个值文件夹吗? @Advait 目前我正在使用 values-xxhdpi 文件夹,但问题是,它为 5、5.5 和 6 屏幕使用相同的文件夹,因此在 5 英寸屏幕和 5.5 屏幕上出现滚动。我不想那样。你能帮帮我吗? @Advait S values-xxhdpi for 5.5" 1080x1920 & Also for 5.5" 1440x2560 我想要 5.5" 1440x2560 的不同文件夹。 @ULHASPATIL 完全正确!我遇到了类似的问题,不明白如何解决。对于类似英寸和不同像素分辨率的屏幕,您有没有找到解决方案?【参考方案3】:

我们希望看到不同屏幕中所需视图大小的变化。

我们需要为不同的屏幕创建不同的values文件夹,并根据屏幕密度放置dimens.xml文件。

我已经使用了一个 TextView 并观察了当我在 不同的值文件夹。

请按照流程进行

正常 - xhdpi \dimens.xml

下面的设备可以在我们改变正常的时候改变屏幕的大小 - xhdpi\dimens.xml

nexus 5X (5.2" * 1080 * 1920 : 420dpi)

nexus 6P (5.7" * 1440 * 2560 : 560dpi)

nexus 6 (6.0" * 1440 * 2560 : 560dpi)

nexus 5 (5.0", 1080 1920 : xxhdpi)

nexus 4 (4.7", 768 * 1280 : xhdpi)

银河系 (4.7", 720 * 1280 : xhdpi)

4.65" 720p (720 * 1280: xhdpi)

4.7" WXGA (1280 * 720 : Xhdpi)

Xlarge - xhdpi\dimens.xml

当我们更改Xlarge - xhdpi\dimens.xml时,以下设备可以更改屏幕大小

nexus 9 (8.9", 2048 * 1556 : xhdpi)

nexus 10 (10.1", 2560 * 1600 : xhdpi)

大 - xhdpi\dimens.xml

以下设备可以在我们更改大屏幕时更改屏幕大小 - xhdpi\dimens.xml

nexus 7 (7.0", 1200 * 1920: xhdpi)

nexus 7 (2012) (7.0", 800 * 1280 : tvdpi)

在“搜索通用手机和平板电脑”中可以看到以下屏幕

大 - mdpi\dimens.xml

以下设备可以在我们更改大屏幕时更改屏幕尺寸 - mdpi\dimens.xml

5.1" WVGA (480 * 800: mdpi)

5.4" FWVGA (480 * 854: mdpi)

7.0" WSVGA(平板电脑)(1024 * 600:mdpi)

正常 - hdpi \dimens.xml

下面的设备可以在我们改变正常的时候改变屏幕的大小 - hdpi\dimens.xml

nexus (4.0", 480 * 800 : hdpi)

nexus one (3.7", 480 * 800: hdpi)

小 - ldpi\dimens.xml

下面的设备可以在我们更改小-ldpi\dimens.xml时改变屏幕大小

2.7" QVGA 滑块 (240 * 320 : ldpi)

2.7" QVGA (240 * 320: ldpi)

xlarge - mdpi\dimens.xml

当我们更改xlarge - mdpi\dimens.xml时,以下设备可以更改屏幕大小

10.1" WXGA(平板电脑)(1280 * 800:MDPI)

正常 - ldpi\dimens.xml

下面的设备可以在我们更改正常时改变屏幕大小 - ldpi\dimens.xml

3.3" WQVGA (240 * 400: LDPI)

3.4" WQVGA (240 * 432 : LDPI)

正常 - hdpi \dimens.xml

下面的设备可以在我们改变正常的时候改变屏幕的大小 - hdpi\dimens.xml

4.0" WVGA (480 * 800: hdpi)

3.7" WVGA (480 * 800: hdpi)

3.7" FWVGA 滑块 (480 * 854 : hdpi)

正常 - mdpi \dimens.xml

下面的设备可以在我们更改正常时更改屏幕大小 - mdpi\dimens.xml

3.2" HVGA 滑块 (ADP1) (320 * 480 : MDPI)

3.2" QVGA (ADP2) (320 * 480: MDPI)

【讨论】:

所以根据你的说法,文件夹将被命名为values-normal-xhdpi? 是的,我同意你的观点,而不是向所有文件写入值,我说,“为不同的文本大小创建不同的值文件夹”。所以请阅读标题。谢谢。 它不起作用***.com/questions/67604335/… 它总是从所有设备的同一个文件夹中获取值【参考方案4】:

有很好的库可以处理所有事情并减轻您的痛苦。要使用它,只需在 gradle 中添加两个依赖项:

 implementation 'com.intuit.ssp:ssp-android:1.0.5'
 implementation 'com.intuit.sdp:sdp-android:1.0.5'

之后,像这样使用dimens

        android:layout_marginTop="@dimen/_80sdp"

【讨论】:

以下是供参考的库:SDP 和 SSP。感谢您的准确回答! 根据当前时间 2020 这也不完美 如果您认为理想大小为 5"。使用这些库就可以了。【参考方案5】:

你必须为不同的屏幕创建不同的values文件夹,并根据密度放置dimens.xml文件。

1) values

2) values-hdpi (320x480 ,480x800)

3) values-large-hdpi (600x1024)

4) values-xlarge (720x1280 ,768x1280 ,800x1280 ,Nexus7 ,Nexus10)

5) values-sw480dp (5.1' WVGA screen)

6) values-xhdpi (Nexus4 , Galaxy Nexus)

【讨论】:

我在哪里可以获得屏幕尺寸之间的配给?正如我在工具中看到的那样,他们以ldpi,mdpi 的方式定义了所有内容 这将取决于您的值文件夹,该文件夹最多可以从中检索值。 对于 Nexus 6,我是否需要提及 values-xxhdpi 320x480 是典型的 mdpi。所以,把它放在valuesvalues-mdpi 横向模式呢?【参考方案6】:

我上传了一个简单的 java 程序,它将您的项目位置和您想要的维度文件作为输入。在此基础上,它将在控制台中输出相应的维度文件。这是它的链接:

https://github.com/akeshwar/Dimens-for-different-screens-in-Android/blob/master/Main.java

这是参考的完整代码:

public class Main 


    /**
     * You can change your factors here. The current factors are in accordance with the official documentation.
     */
    private static final double LDPI_FACTOR = 0.375;
    private static final double MDPI_FACTOR = 0.5;
    private static final double HDPI_FACTOR = 0.75;
    private static final double XHDPI_FACTOR = 1.0;
    private static final double XXHDPI_FACTOR = 1.5;
    private static final double XXXHDPI_FACTOR = 2.0;

    private static double factor;

    public static void main(String[] args) throws IOException 


        Scanner in = new Scanner(System.in);
        System.out.println("Enter the location of the project/module");
        String projectPath = in.nextLine();

        System.out.println("Which of the following dimension file do you want?\n1. ldpi \n2. mdpi \n3. hdpi \n4. xhdpi \n5. xxhdpi \n6. xxxhdpi");

        int dimenType = in.nextInt();

        switch (dimenType) 
            case 1: factor = LDPI_FACTOR;
                break;
            case 2: factor = MDPI_FACTOR;
                break;
            case 3: factor = HDPI_FACTOR;
                break;
            case 4: factor = XHDPI_FACTOR;
                break;
            case 5: factor = XXHDPI_FACTOR;
                break;
            case 6: factor = XXXHDPI_FACTOR;
                break;
            default:
                factor = 1.0;
        

        //full path = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/src/main/res/values/dimens.xml"
        //location of the project or module = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/"


        /**
         * In case there is some I/O exception with the file, you can directly copy-paste the full path to the file here:
         */
        String fullPath = projectPath + "/src/main/res/values/dimens.xml";

        FileInputStream fstream = new FileInputStream(fullPath);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

        String strLine;

        while ((strLine = br.readLine()) != null)   
            modifyLine(strLine);
        
        br.close();

    

    private static void modifyLine(String line) 

        /**
         * Well, this is how I'm detecting if the line has some dimension value or not.
         */
        if(line.contains("p</")) 
            int endIndex = line.indexOf("p</");

            //since indexOf returns the first instance of the occurring string. And, the actual dimension would follow after the first ">" in the screen
            int begIndex = line.indexOf(">");

            String prefix = line.substring(0, begIndex+1);
            String root = line.substring(begIndex+1, endIndex-1);
            String suffix = line.substring(endIndex-1,line.length());


            /**
             * Now, we have the root. We can use it to create different dimensions. Root is simply the dimension number.
             */

            double dimens = Double.parseDouble(root);
            dimens = dimens*factor*1000;
            dimens = (double)((int)dimens);
            dimens = dimens/1000;
            root = dimens + "";

            System.out.println(prefix + " " +  root + " " + suffix );

        

        System.out.println(line);
    

【讨论】:

【参考方案7】:

你可以输入dimens.xml

1) 价值观

2) 值-hdpi

3) 值-xhdpi

4) 值-xxhdpi

并在dimens.xml中根据密度在对应的文件夹中给出不同的尺寸。

【讨论】:

不推荐使用 Android 文档 small/normal/large。 它不起作用***.com/questions/67604335/… 它总是从所有设备的同一个文件夹中获取值【参考方案8】:

如果您想查看更多信息:这里有一个link 设备列表(平板电脑、手机、手表),包括watchchromebookwindowsmac。在这里你可以找到密度、尺寸等。只是基于它在这里,如果你也使用模拟器,它是一个很好的资源。

如果您单击特定项目,它将在右侧显示更多详细信息。

既然是Android,那我就发个相关的吧。

~ 最好保存一份网络副本。离线查看。

【讨论】:

【参考方案9】:

Android 3.2 引入了一种新的屏幕尺寸方法,描述屏幕尺寸的数字都以“dp”为单位。大部分我们可以使用

最小宽度 dp: 应用程序布局可用的最小宽度,以“dp”为单位;这是您在显示器的任何旋转中遇到的最小宽度 dp。

res >>> new >>> Android资源目录

上一键创建

可用的限定符窗口移动最小屏幕宽度选择的限定符

Screen width 窗口中,只需写入“dp”值,从您希望 Android Studio 使用该尺寸开始。

比起切换到Project视图,右键点击你新创建的资源目录

new >>> Values资源文件输入一个新的文件名dimens.xml就完成了。

【讨论】:

感谢您解释如何实际创建这些文件夹。

以上是关于如何为android中每个不同的屏幕尺寸定义dimens.xml?的主要内容,如果未能解决你的问题,请参考以下文章

如何为不同的屏幕尺寸android studio自动调整imageview的大小?

如何为不同的屏幕尺寸创建具有自动布局的比例视图?

Android 如何支持不同的手机版本和屏幕尺寸?

Android-如何为所有手机设备或大多数手机开发应用程序概念和技术

如何为 iPhone 6+、6 和 5 指定不同的尺寸?

如何为 iPhone 6/7 自定义边到边图像指定尺寸?