如何在android中为每个不同的屏幕尺寸定义dimens.xml?
How to define dimens.xml for every different screen size in android?
在 Android 中支持不同的屏幕尺寸(密度)时,通常重点是为每个可能的屏幕创建不同的布局。即
- ldpi
- mdpi
- hdpi
- xhdpi
- xxhdpi
- xxxhdpi
我设计了一个xhdpi屏幕的布局作为参考,并在[=24中定义了尺寸 =]dimens.xml。现在 我想支持所有可能的屏幕尺寸。我该怎么做?
据我所知,我可以使用 this 工具找出正确的 dimens.xml对于其他屏幕尺寸并将其添加到我的项目中。在我的情况下,这是正确的做法吗?
另一个问题,是否只需要为以上屏幕尺寸创建dimens.xml?如果是那么什么是 w820dp
?
感谢您的帮助。我需要仅支持 手机 (不支持平板电脑或其他设备)。
你可以把dimens.xml
放在
1) 值
2) 值-hdpi
3) 值-xhdpi
4) 值-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)
您必须为不同的屏幕创建不同的值文件夹。
喜欢
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
您可以使用名为 Dimenify 的 Android Studio 插件,根据自定义比例因子自动为其他像素桶生成维度值。它仍处于测试阶段,请务必通知您遇到的任何 issues/suggestions 开发人员。
我上传了一个简单的 java 程序,它将您的项目位置和您想要的尺寸文件作为输入。基于此,它会在控制台输出相应的维度文件。这是它的 link:
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);
}
}
我们想看看不同屏幕下所需视图大小的变化。
我们需要为不同的屏幕创建不同的值文件夹,并根据屏幕密度放置 dimens.xml 文件。
我使用了一个 TextView 并观察了当我更改 dimens.xml 时的变化
不同的值文件夹。
请遵循流程
正常 - 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 s ( 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)
如果您想查看更多:这里是 link 设备列表(平板电脑、手机、手表),包括 watch
、chromebook
、windows
和 mac
。 Here you can find the density, dimensions, and etc. 只是基于这里,如果你也使用模拟器,这是一个很好的资源。
如果您单击特定项目,它会在右侧显示更多详细信息。
既然是Android
,我就post与之相关。
~如果能保存一份网盘就更好了。离线查看。
Android 3.2引入了一种新的屏幕尺寸方法,描述屏幕尺寸的数字都是“dp”units.Mostly我们可以使用
最小宽度dp:应用程序布局可用的最小宽度,以“dp”为单位;这是您在显示器的任何旋转中遇到的最小宽度 dp。
右键单击 res >>> new >>> Android 资源目录
从可用的限定符 window移动最小屏幕宽度到选择的限定符
在 屏幕宽度 window 中,只需写入 "dp" 值,从您希望 Android Studio 使用该尺寸开始。
然后更改为 Project 视图,右键单击您新创建的资源目录
new >>> Values resource file enter a new file name dimens.xml,你就完成了。
使用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_width="@dimen/_50sdp"
android:layout_height="@dimen/_50sdp"
android:text="Hello World!" />
工作原理:
sdp
随屏幕尺寸缩放,因为对于每个可能的 dp
值,它本质上是一个巨大的不同 dimens.xml
列表。
实际操作:
这是在屏幕尺寸和密度差异很大的三种设备上显示的:
请注意,由于某些性能和可用性限制,sdp
尺寸单位计算包括一些近似值。
有很好的库可以处理所有事情并减轻您的痛苦。要使用它,只需在 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"
在 Android 中支持不同的屏幕尺寸(密度)时,通常重点是为每个可能的屏幕创建不同的布局。即
- ldpi
- mdpi
- hdpi
- xhdpi
- xxhdpi
- xxxhdpi
我设计了一个xhdpi屏幕的布局作为参考,并在[=24中定义了尺寸 =]dimens.xml。现在 我想支持所有可能的屏幕尺寸。我该怎么做?
据我所知,我可以使用 this 工具找出正确的 dimens.xml对于其他屏幕尺寸并将其添加到我的项目中。在我的情况下,这是正确的做法吗?
另一个问题,是否只需要为以上屏幕尺寸创建dimens.xml?如果是那么什么是 w820dp
?
感谢您的帮助。我需要仅支持 手机 (不支持平板电脑或其他设备)。
你可以把dimens.xml
放在
1) 值
2) 值-hdpi
3) 值-xhdpi
4) 值-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)
您必须为不同的屏幕创建不同的值文件夹。 喜欢
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
您可以使用名为 Dimenify 的 Android Studio 插件,根据自定义比例因子自动为其他像素桶生成维度值。它仍处于测试阶段,请务必通知您遇到的任何 issues/suggestions 开发人员。
我上传了一个简单的 java 程序,它将您的项目位置和您想要的尺寸文件作为输入。基于此,它会在控制台输出相应的维度文件。这是它的 link:
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);
}
}
我们想看看不同屏幕下所需视图大小的变化。
我们需要为不同的屏幕创建不同的值文件夹,并根据屏幕密度放置 dimens.xml 文件。
我使用了一个 TextView 并观察了当我更改 dimens.xml 时的变化 不同的值文件夹。
请遵循流程
正常 - 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 s ( 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)
如果您想查看更多:这里是 link 设备列表(平板电脑、手机、手表),包括 watch
、chromebook
、windows
和 mac
。 Here you can find the density, dimensions, and etc. 只是基于这里,如果你也使用模拟器,这是一个很好的资源。
如果您单击特定项目,它会在右侧显示更多详细信息。
既然是Android
,我就post与之相关。
~如果能保存一份网盘就更好了。离线查看。
Android 3.2引入了一种新的屏幕尺寸方法,描述屏幕尺寸的数字都是“dp”units.Mostly我们可以使用
最小宽度dp:应用程序布局可用的最小宽度,以“dp”为单位;这是您在显示器的任何旋转中遇到的最小宽度 dp。
右键单击 res >>> new >>> Android 资源目录
从可用的限定符 window移动最小屏幕宽度到选择的限定符
在 屏幕宽度 window 中,只需写入 "dp" 值,从您希望 Android Studio 使用该尺寸开始。
然后更改为 Project 视图,右键单击您新创建的资源目录
new >>> Values resource file enter a new file name dimens.xml,你就完成了。
使用Scalable DP
虽然为不同的屏幕尺寸制作不同的布局在理论上是个好主意,但要适应 所有 屏幕尺寸和像素密度可能会变得非常困难。如上述答案中所建议的,拥有超过 20 个不同的 dimens.xml
文件,根本不容易管理。
使用方法:
使用sdp
:
- 在您的
build.gradle
、 中加入 将任何
dp
值(例如50dp
替换为@dimen/50_sdp
,如下所示:<TextView android:layout_width="@dimen/_50sdp" android:layout_height="@dimen/_50sdp" android:text="Hello World!" />
implementation 'com.intuit.sdp:sdp-android:1.0.5'
工作原理:
sdp
随屏幕尺寸缩放,因为对于每个可能的 dp
值,它本质上是一个巨大的不同 dimens.xml
列表。
实际操作:
这是在屏幕尺寸和密度差异很大的三种设备上显示的:
请注意,由于某些性能和可用性限制,sdp
尺寸单位计算包括一些近似值。
有很好的库可以处理所有事情并减轻您的痛苦。要使用它,只需在 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"