如何在 android 中为每个不同的屏幕大小定义量纲.xml?

当在 仿生人中支持不同的屏幕大小(密度)时,通常的重点是为每个可能的屏幕创建不同的布局。也就是说。

  • 低密度脂蛋白
  • Mdpi
  • Hdpi
  • Xhdpi
  • Xxhdpi
  • Xxxhdpi

我为 Xhdpi屏幕设计了一个布局作为参考,并在 < em > dimens.xml 中定义了 尺寸

据我所知,我可以使用 这个工具,找出适当的 < em > dimens.xml 为其他屏幕尺寸,并添加到我的项目。在我这种情况下,这样做对吗?

另一个问题,我是否只需要为上面的屏幕尺寸创建 < em > medis.xml ? 如果是,那么什么是 < em > w820dp

谢谢你的帮助。我需要支持 只能打电话(不是平板电脑或其他设备)。

196228 次浏览

你可以输入 dimens.xml

1) 价值观

2) 值-hdpi

3) Value-xhdpi 值-xhdpi

4) Value-xxhdpi

并根据密度在相应的文件夹中给出 dimens.xml中不同的大小。

您必须为不同的屏幕创建不同的 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)

你必须创建 < em > 不同屏幕的不同值文件夹 。 喜欢

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

enter image description here

如欲了解更多资料,请浏览此处

Android 中的不同值文件夹

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

编辑: 作者: < strong > @ Humblerookie

您可以使用名为 维度的 Android Studio 插件根据自定义缩放因子为其他像素桶自动生成维度值。它仍处于测试阶段,一定要通知开发人员你遇到的任何问题/建议。

我已经上传了一个简单的 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);
}
}

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

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

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

请遵循程序

Normal-xhdpi dimens.xml

下面的设备可以在我们更改 Normal-xhdpi  xml 时更改屏幕的大小

Nexus 5X (5.2”* 1080 * 1920:420dpi)

Nexus6P (5.7”* 1440 * 2560:560dpi)

Nexus6(6.0”* 1440 * 2560:560dpi)

Nexus5(5.0”,10801920: xxhdpi)

Nexus4(4.7”,768 * 1280: xhdpi)

Galaxy Nexus (4.7”,720 * 1280: xhdpi)

4.65”720p (720 * 1280: xhdpi)

4.7”WXGA (1280 * 720: Xhdpi)

Xlarge-xhdpi  元素.xml

下面的设备可以在我们更改 Xlarge-xhdpi 维度. xml 时更改屏幕的大小

Nexus9(8.9”,2048 * 1556: xhdpi)

Nexus10(10.1”,2560.1600: xhdpi)

大型-xhdpi 维度. xml

下面的设备可以在我们更改 big-xhdpi  xml 时更改屏幕的大小

Nexus7(7.0”,1200 * 1920: xhdpi)

Nexus7(2012)(7.0”,800 * 1280: tvdpi)

以下屏幕在「搜寻通用电话及平板电脑」中可见

大型 mdpi 维度. xml

下面的设备可以在我们更改 big-mdpi  xml 时更改屏幕的大小

5.1”WVGA (480 * 800: mdpi)

5.4”FWVGA (480 * 854: mdpi)

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

Normal-hdpi dimens.xml

下面的设备可以在我们更改 Normal-hdpi  xml 时更改屏幕的大小

Nexus s (4.0”,480 * 800: hdpi)

Nexusone (3.7”,480 * 800: hdpi)

Small-ldpi 值. xml

下面的设备可以在我们更改 small-ldpi  xml 时更改屏幕的大小

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

2.7”QVGA (240 * 320: ldpi)

Xlarge-mdpi iments.xml

下面的设备可以在我们更改 xlarge-mdpi 维度. xml 时更改屏幕的大小

10.1”WXGA (tABlet)(1280 * 800: MDPI)

Normal-ldpi dimens.xml

下面的设备可以在我们更改 Normal-ldpi  xml 时更改屏幕的大小

3.3”WQVGA (240 * 400: LDPI)

3.4”WQVGA (240 * 432: LDPI)

Normal-hdpi dimens.xml

下面的设备可以在我们更改 Normal-hdpi  xml 时更改屏幕的大小

4.0”WVGA (480 * 800: hdpi)

3.7”WVGA (480 * 800: hdpi)

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

Normal-mdpi dimens.xml

下面的设备可以在我们更改 Normal-mdpi  xml 时更改屏幕的大小

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

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

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

如果单击特定项,它将在右侧显示更多细节。 sample

因为它是 Android,我会发布相关的。 sample1

sample2

如果你保存一份网页的副本会更好。离线查看。

Android 3.2引入了一种新的屏幕尺寸方法,描述屏幕尺寸的数字都是以“ dp”为单位。大多数情况下我们可以利用

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

要创建一个右键单击 保留意见 > > 新的 > > > Android 资源目录

可用的限定词窗口将 最小屏幕宽度移动到 选择资格赛

屏幕宽度窗口中,只需写入“ dp”值,从您希望 Android Studio 使用该维度开始。

然后更改为 工程项目视图,右键单击新创建的资源目录

New > > > 值资源文件输入一个新的文件名 Xml,然后就完成了。

使用 可伸缩 DP

尽管在理论上为不同的屏幕尺寸制作不同的布局是一个好主意,但是要适应 所有屏幕尺寸和像素密度会变得非常困难。拥有超过20多个不同的 dimens.xml文件,正如上面的答案建议,是不容易管理的。

使用方法:

使用 sdp:

  1. 在你的 build.gradle中包含 implementation 'com.intuit.sdp:sdp-android:1.0.5',
  2. 将任何 dp值(如 50dp)替换为 @dimen/50_sdp,如下所示:

    <TextView
    android:layout_width="@dimen/_50sdp"
    android:layout_height="@dimen/_50sdp"
    android:text="Hello World!" />
    

How It Works:

sdp scales with the screen size because it is essentially a huge list of different dimens.xml for every possible dp value.

enter image description here

See It In Action:

Here it is on three devices with widely differing screen dimensions, and densities:

enter image description here

Note that the sdp size unit calculation includes some approximation due to some performance and usability constraints.

有一些很好的库可以处理所有事情并减少你的痛苦。要使用它,只需在 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"

在代码中获得更大灵活性的基本原则是封装正在变化/变化的内容(或者极有可能变化的内容)。

如果您的大小写尺寸正在改变。因此,首先将您的维度(您认为需要更改的维度)从 XML 代码或从 java/kotlin 代码移动到文件值/量纲.XML

关于这个问题的上下文。 您可以使用密度限定符或小宽度限定符来设置 res 文件夹。

values/dimens.xml
values-ldpi/dimens.xml
values-hdpi/dimens.xml


values/dimens.xml
values-sw320dp/dimens.xml
values-sw320dp/dimens.xml
 

这里需要注意的一个重要问题是,value/diments.xml 中的项将应用于小于指定的最低断点的屏幕。

values/dimens.xml //smallest screen
values-sw320dp/dimens.xml //320dp or more till next breakpoint folder
values-sw360dp/dimens.xml//360dp or more till next breakpoint folder

另一个需要注意的重点是,高像素密度的设备可能有一个小屏幕。所以请确认是否要指定密度限定符或屏幕宽度限定符。


对于这方面的新手,我们将作进一步的介绍。

可以将限定符添加到不同的资源文件夹,如值、可绘制文件夹和布局。

这些限定符可以表示语言(- en,-hi)、方向(- land,-port)或屏幕大小范围(- ldpi,-hdpi)。

变数命名原则有限定词的层次结构,限定词只能按这个顺序添加。

    values-en-hdpi (it cannot be values-hdpi-en)
values-en-land-hdpi (it cannot be values values-hdpi-en-land or any other order)
layout-hdpi

该订单记录在 此页的表2

一些限定符表示绝对值,而另一些如 ldpi、 hdpi 表示断点。