【问题标题】:Android Scaling DensityAndroid 缩放密度
【发布时间】:2013-10-16 16:33:43
【问题描述】:

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

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

Android 清单:

    <!-- 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"/>

文件夹结构包括 价值观 价值观 价值观 值-sw600dp

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

(注意*)每当我尝试从 dimens.xml 添加 xml sn-p 时,它都会对其进行有趣的格式化并删除所有 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>

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

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.00dp 18.00dp 150.00dp 18.00dp 37.50dp

一切都会好起来的

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

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

【问题讨论】:

  • 请从 values 和 values-sw600dp 发布您的dimens.xml
  • 修剪以适应评论限制 40.00dp14.00dp14.00dp24.00sp36.00dp 24.00sp40.00dp36.00dp
  • 您如何访问这些 dimens.xml 值?
  • 横向的 SGS4 可能会命中 sw600dp 资源。你能确认不是吗?

标签: android scaling


【解决方案1】:

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

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

【讨论】:

  • 我认为您误解了密度和屏幕尺寸之间的关系。 Android 确实会在 hdpi 上将 25dp 转换为 37px(并在 mdpi 上将其保持为 25px),但这将产生相同的屏幕尺寸,无论屏幕尺寸之间的差异如何。它补偿了密度,听起来你也希望它补偿屏幕尺寸
  • SGS3、SGS4、三星 Galaxy Tab 2 和较旧的 HTC。我也有很多其他设备,但我只是注意到它没有为 hdpi 设备提供 1.5 像素的缩放比例。我在这上面花了好几天的时间:(。只有当我提供文档中指示的所有比例缩放 dp 时,它才有效,如 ldpi 0.75、mdpi 1.0、hdpi 1.5 和 xhdpi 2.0。如果我使用该数学并缩放每个的 dp基于这些值的相应密度目录,它工作得很好。这是我试图避免的,虽然 Android 应该为你处理这个。
  • 我可以向您保证,它正在扩大dp 的值。您可以通过在不同设备上使用getWidth()/getHeight() 转储像素值来验证这一点。 Galaxy Tab 2 是 mdpi,SGS{3,4} 是 xhdpi,HTC 是未知数。让我们以 Tab 2 和 SGS4 为例。 Tab的屏幕为149ppi,而SGS4的屏幕为441ppi。 values/dimens.xml 中的 10dp 在 Tab 2 上为 10px,在 SGS4 上为 20px。但是,由于尺寸不同,Tab2 上为 0.067in,SGS4 上为 0.0454in。明显不同的尺寸,但已考虑到密度。
  • screenLayout 与密度无关。不过,它与屏幕尺寸有关(实际物理尺寸,以英寸为单位)。尺寸解释here。您可以使用getResources().getDisplayMetrics().density 获取密度。
  • 你的误解。我还没有运行它,但代码正在打印出dps。它们是与密度无关的;您正在改变设备之间的密度,但这不会改变它们。像素数量会发生变化,但dps 不会,这就是它们有用的原因!除了求助于文档之外,我不完全确定如何更好地解释这一点。我真的鼓励您从上到下阅读Supporting Multiple Screens,以了解发生了什么。屏幕截图部分特别有用,但请务必阅读全文。
【解决方案2】:

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

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

您应该valuesvalues-hdpi 中有dimens.xml,因为dp 单元已经处理了密度缩放。

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

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

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

@dimen/round_circle_height

如果从 xml 引用。

【讨论】:

  • 我只对所有值使用了 dp 和 sp,希望它可以缩放,但这不起作用。我也没有值-大。我只有一个 values 和一个 values-sw600dp。我正在 SGS3、SGS4 和三星 Galaxy Tab 2 上进行测试。Tab 2 正在从 values-sw600 中获取密度值,而手机正在使用 xml 中列出的 dp 值从 values 文件夹中获取值,而不是缩放到hdpi 他们应该是。
  • 定义“缩放到它们应有的 hdpi”。它们不是“意味着”“规模化”。 dp 值的想法是,40x40dp 按钮将始终为 1/4 英寸正方形,无论平板电脑分辨率如何。这可能会转换为 mdpi 上的 40x40 像素,或者可能是 80x80 的按钮xhdpi 上的像素。您是否希望 UI 元素可以放大以适应更大的屏幕?
  • 不......我可能对我的措辞感到困惑。我希望布局在所有设备上看起来都一样。不要变大。我想要一致的尺寸。目前该设计仅在 mdpi 设备上看起来不错。它在 hdpi 设备上看起来很小,除非我以 1.5 的比率为 values-hdpi 提供带有缩放的 dimens.xml 文件的目录。如果我提供 dimens.xml 的缩放版本,它看起来很好,否则它不会根据 mdpi 级别提供的密度缩放像素
  • 是的,我是从 xml 中完成的,就像你在上面展示的那样
  • 我只是添加了这些测试值以确认它是否在第一个屏幕上缩放,并且它绝对不是根据提供的密度和指定的密度独立像素来缩放像素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多