【问题标题】:Is my method to set up android apps dimensions correct?我设置 android 应用程序尺寸的方法是否正确?
【发布时间】:2017-02-02 18:52:57
【问题描述】:

我使用Android studio作为开发环境,我设置android应用维度的方法是这样的:

1- 我基于 Android Studio 提供的 Nexus S 为 hdpi 设备创建布局。

2- 我将所有尺寸(使用 dp 和 sp 单位)放在 values-hdpi 文件夹中。

3- 我从这个文件夹复制了 9 个副本并将它们重命名为:

  1. values-420dpi
  2. values-560dpi
  3. 值-ldpi
  4. 值-mdpi
  5. values-sw480dp
  6. 值-sw600dp
  7. 值-sw720dp
  8. 值-xhdpi
  9. 值-xxhdpi

4- 之后,我打开要配置其尺寸的布局文件并选择以下内容:

  1. Nexus 5X FOR 420dpi
  2. Nexus 6P FOR 560dpi
  3. 2.7" QVGA 用于 ldpi
  4. 3.2" QVGA FOR mdpi
  5. 5.4" FWVGA FOR sw480dp
  6. 适用于 sw600dp 的 Nexus 7
  7. 适用于 sw720dp 的 Nexus 9
  8. 用于 xhdpi 的 Nexus 4
  9. 用于 xxhdpi 的 Nexus 5

5- 我开始更改每个文件中的尺寸,直到布局适合所选设备。

这是我设置android应用程序尺寸的方法,我想知道它是否正确?如果它存在另一种方法来做同样的事情但很容易?

【问题讨论】:

  • 如果设备在 420dpi 和 560dpi 之间会发生什么?让我们说490dpi?我希望你没有在你的 xmls 中硬编码宽度和高度。
  • @RadekJ 你的意思是我的方法不对吗??
  • 如果是这样,你有另一种方法来正确配置它们吗?
  • 首先你应该使用 FrameLayout (layout_gravities),RelativeLayout(alignParent, below and other params),LinearLayouts(weights), 来布局你的视图,然后如果它不足以提供好看的布局每个设备,您都应该考虑为不同的屏幕尺寸/方向定义不同的布局。
  • 好的,非常感谢。

标签: android android-resources dimensions android-screen-support


【解决方案1】:

您应该只使用一种类型的选择器。例如,在您的情况下:

  1. values-sw420dp
  2. values-sw480dp
  3. values-sw560dp
  4. values-sw600dp
  5. values-sw720dp

应该足够了(但显然这取决于应用程序的要求和您想要完全支持的设备)。为什么还要使用基于密度的选择器(如values-mdpi)?您可能知道,dpsp 维度与密度无关。

值得补充的是,如果您仔细设计布局,可以大大减少需要显式声明的维度数量。例如,您可以将LinearLayouts 用于称重的孩子。

在复杂的项目中,当我希望应用程序随屏幕大小缩放时,我通常使用脚本从参考文件开始生成所有尺寸文件,并将所需的乘数应用于每个屏幕类。实际代码很大程度上取决于您的特定需求,但 Java 中的示例可能是:

public class GenerateDimens {

    public static void main(String[] args) throws Exception {
        String resFolder = "app/src/main/res/";
        String dimensFileName = "dimens.xml";
        File source = new File(resFolder + "values-sw800dp", dimensFileName);
        File target = new File(resFolder + "values-sw0dp", dimensFileName);
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document document = builder.parse(source);
        NodeList nodeList = document.getElementsByTagName("dimen");
        Pattern pattern = Pattern.compile("(\\d+).*");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node dimen = nodeList.item(i);
            String textContent = dimen.getTextContent();
            Matcher matcher = pattern.matcher(textContent);
            if (matcher.find()) {
                String oldValue = matcher.group(1);
                String newValue = String.valueOf((int) (Integer.parseInt(oldValue) / 1.33));
                dimen.setTextContent(textContent.replaceFirst(oldValue, newValue));
            }
        }
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");
        document.setXmlStandalone(true);
        transformer.transform(new DOMSource(document), new StreamResult(target));
    }

}

【讨论】:

  • 好的,非常感谢,能否给我您所说的在复杂项目中使用的维度生成器源代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多