【问题标题】:Android Nougat has different dp calculation? Button sizes changed after updateAndroid Nougat 有不同的 dp 计算?更新后按钮大小更改
【发布时间】:2017-08-07 15:40:19
【问题描述】:

我的三星 Galaxy s7 刚刚更新到 Android Nougat 7.0,我注意到一些按钮的显示方式有所不同。我碰巧有另一个尚未完成更新的 Galaxy s7(Marshmallow 6.0.1)。我可以很清楚地看到大小的差异:

棉花糖:

牛轧糖:

SHARE 按钮的 layout_height 很难设置为 44dp。在 Android Studio 中使用 Layout Inspector 我可以读到它解析为 Marshmallow 的 176px 和 Nougat 的 132px(mMeasuredHeight 的值相同)。您还可以看到左侧布局的其他部分保持不变(忽略小拇指向上图标)。

另一个例子:

棉花糖:

牛轧糖:

我正在为按钮使用以下样式:

<style name="AppTheme.Button" parent="Widget.AppCompat.Button">
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">@color/colorPrimaryDark</item>
        <item name="android:backgroundTint" tools:targetApi="lollipop">@color/colorTextBrightPrimary</item>
        <item name="backgroundTint" >#FFFFFF</item>
        <item name="colorButtonNormal">@color/colorTextBrightPrimary</item>
    </style>
    <style name="AppTheme.Button.Accent" parent="AppTheme.Button">
        <item name="android:textColor">@color/colorTextBrightPrimary</item>
        <item name="android:backgroundTint" tools:targetApi="lollipop">@color/colorAccent</item>
        <item name="backgroundTint" >@color/colorAccent</item>
        <item name="colorButtonNormal">@color/colorAccent</item>
    </style>

虽然 SHARE 按钮是自定义视图,但扩展了 AppCompatButton,Google 和 Facebook auth 按钮只是 AppCompatButtons。无论哪种方式,它们在更新之前看起来都不同,并且代码和设备上没有任何其他更改(文本大小和缩放是相同的)。

知道发生了什么吗?如何确保这些布局在各种设备/操作系统上保持相同?

【问题讨论】:

  • “在 Android Studio 中使用 Layout Inspector 我可以读到它解析为 Marshmallow 的 176px 和 Nougat 的 132px(mMeasuredHeight 的值相同)”——是否有任何边距?这些边距有变化吗? SHARE按钮在里面的任何容器上是否有任何填充?那个填充改变了吗?如果您查看ConfigurationDensityMetrics,它们报告的密度是否发生了变化?
  • @CommonsWare 在这两种情况下都没有边距。在这两种情况下,容器填充都等于 0。然而,按钮的填充确实发生了变化。牛轧糖 48 40 48 40 和棉花糖 36 30 36 30 分别用于左上右下。我不在任何地方的代码中设置填充
  • 好的,也许他们改变了按钮的默认填充。这将解释部分差异,尽管可能不是全部。您可以尝试在您的样式中定义填充,看看有多大帮助。
  • @CommonsWare 抱歉,我犯了一个错误,它填充了 Marshmallow 48/40 和 Nougat 36/30 - 这没有意义吧?为什么不同的解析高度?我尝试更改填充,但正如预期的那样,它进一步增加了填充。
  • 我继续假设按钮的默认可绘制对象可能已更改,因此存在差异,因此我创建了自己的可绘制对象,以便更好地控制填充和大小。不是一个理想的解决方案,因为涟漪效果不如原来的那么好,因此这并不是问题的真正答案。该主题的任何想法或线索都会很棒!

标签: android android-layout android-6.0-marshmallow android-button android-7.0-nougat


【解决方案1】:

drawable 可以有自己的填充。在九个补丁PNG文件的情况下,这只是在图像的实际非透明/调整大小部分之外具有透明像素。对于ShapeDrawable,可以直接在XML中声明padding。等等。这可能会或可能不会在 Layout Inspector 等工具中显示为“填充”,因为它们专注于在小部件上声明的填充。

由于您使用的以前的背景有问题,而替换背景没有,我猜这种隐式填充是问题。

你有两种方法来尝试处理这个问题:

  • 风险但简单的方法是尝试在按钮本身上使用负填充,在样式资源的 res/values-v24/ 变体中(或者,可选地,在样式中使用一致的维度资源并改变尺寸值是否基于-v25)。您必须稍作修改才能尝试获取“撤消”更改的值。我称之为“冒险”,因为我不知道 Android 对负填充的尊重程度。

  • 加重的方法是尝试找到您之前使用的实际按钮背景,看看它有什么变化。可绘制对象将在appcompat-v7 的主题或平台的主题中声明,然后实际的可绘制对象本身将在appcompat-v7 或平台中定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多