0

我在跨多个屏幕缩放 Android 时遇到问题。根据文档,Android OS 将假定您的 dimens.xml 是为 mdpi 创建的,并为 hdpi、xhdpi 等进行相应的缩放...

但是,我无法看到这项工作。如果我有一个用于 values-hdpi 的文件夹,我的 SGS4 看起来很好,从 values-hdpi 中的 dimens.xml 文件应用了 1.5 比例。但是,每当我从项目中删除 values-hdpi 文件夹以允许 Android 操作系统将其扩展到 hdpi 时,SGS4 只会运行 mdpi 值。我不确定我做错了什么。

安卓清单:

    <!-- Screen Support -->
<supports-screens android:resizeable="true"
    android:smallScreens="false"
    android:normalScreens="true"
    android:largeScreens="true"
    android:anyDensity="true"/>


<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15"/>

文件夹结构包括 values-es values-fr values-sw600dp

values 将 mdpi 值存储在 dimens.xml 文件中,所有这些都在 dp 和 sp 中完成。尺寸.xml:

(注意*)每当我尝试从 dimens.xml 添加 xml 片段时,它都会对其进行有趣的格式化并删除所有 dimen name= 东西,并且只列出其中使用的 dp 和 sp 。不知道为什么。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="center_text_margin_right">20dp</dimen>
    <dimen name="answer_row_top_padding">7dp</dimen>
    <dimen name="answer_row_bottom_padding">7dp</dimen>
    <dimen name="answer_number_text_size">12sp</dimen>
    <dimen name="answer_left_margin_from_answer_number">18dp</dimen>
    <dimen name="answer_text_size">12sp</dimen>
    <dimen name="answer_points_right_margin">20dp</dimen>
    <dimen name="answer_points_left_margin">18dp</dimen>
    <dimen name="answer_number_left_margin">60dp</dimen>
    <dimen name="center_text_size">12sp</dimen>
    <dimen name="center_text_margin_left">20dp</dimen>
    <dimen name="center_text_margin_right">20dp</dimen>
    <dimen name="answer_title_height">28dp</dimen>
    <dimen name="round_circle_margin_left">6dp</dimen>
    <dimen name="round_circle_height">6dp</dimen>
    <dimen name="round_circle_width">6dp</dimen>
    <dimen name="total_score_right_margin">26dp</dimen>
    <dimen name="total_score_left_margin">5dp</dimen>
    <dimen name="score_text_size">12sp</dimen>
    <dimen name="trivia_logo_height">25dp</dimen>
    <dimen name="trivia_logo_width">84dp</dimen>
    <dimen name="trivia_logo_margin_left">8dp</dimen>
    <dimen name="question_margin_left">26dp</dimen>
    <dimen name="question_margin_right">26dp</dimen>
    <dimen name="question_top_margin">15dp</dimen>
    <dimen name="question_margin_bottom">20dp</dimen>
    <dimen name="question_text_size">12sp</dimen>
    <dimen name="fun_fact_margin_bottom">100dp</dimen>
    <dimen name="fun_fact_text_size">12dp</dimen>
    <dimen name="answer_row_height">25dp</dimen>
</resources>

如果我用这个文件 dimens.xml 创建一个 values-hdpi 文件夹

30.00dp 10.50dp 10.50dp 18.00dp 27.00dp 18.00dp 30.00dp 27.00dp 90.00dp 18.00dp 30.00dp 30.00dp 42.00dp 9.00dp 9.00dp 9.00dp 39.00dp 7.50dp 18.00dp 37.50dp 126.00dp 8dp 39.00dp 39.00dp 22.50dp 30.00 dp 18.00dp 150.00dp 18.00dp 37.50dp

一切都会好起来的

values-es 和 values-fr 只是包含 strings.xml 的文件夹,没有尺寸。例如,我使用 @dimen/answer_row_height 在整个布局 xml 文件中引用所有内容。

正如我之前所说,如果我在其中放入带有缩放的 dimens.xml 文件的 values-hdpi,它会完美运行,但如果我删除它,Android 不会对其进行缩放。有没有人以前打过这个或知道我在搞砸什么?

4

2 回答 2

3

值不会自动缩放,只有可绘制对象会。

由您来定义您的应用程序需要的所有替代资源(包括值),框架不能也不会为您做出这些决定。

于 2013-10-16T16:39:48.487 回答
1

根据文档,Android OS 将假定您的 dimens.xml 是为 mdpi 创建的,并为 hdpi、xhdpi 等进行相应的缩放...

这是不正确的。如果尺寸以像素 ( ) 为单位,您输入的任何dimens.xml内容都将按原样使用px。您需要将它们放在与密度无关的像素 ( dp) 中以使它们缩放。dimens.xml不应基于分辨率,而应基于屏幕尺寸。你可能有一个dimens.xmlinvalues和 in values-large,为更大的屏幕指定不同的间距,甚至不同的字体大小。

您不应该indimens.xmlvaluesvalues-hdpi因为该dp单元已经处理了密度缩放。

根据您在各个地方留下的评论,您似乎没有正确访问维度资源。你应该使用类似的东西:

getResources().getDimensionPixelSize( R.dimen. round_circle_height );

如果从代码中检索值,或者

@dimen/round_circle_height

如果从 xml 引用。

于 2013-10-16T16:41:11.487 回答