Android 安卓牛轧糖有不同的dp计算?更新后更改了按钮大小

Android 安卓牛轧糖有不同的dp计算?更新后更改了按钮大小,android,android-layout,android-6.0-marshmallow,android-button,android-7.0-nougat,Android,Android Layout,Android 6.0 Marshmallow,Android Button,Android 7.0 Nougat,我的三星Galaxy s7刚刚升级到Android Nougat 7.0,我注意到一些按钮的显示方式有所不同。我碰巧有另一个Galaxy s7,它还没有经过更新(棉花糖6.0.1)。我可以非常清楚地看到尺寸的差异: 棉花糖: 牛轧糖: 共享按钮的布局高度硬设置为44dp。使用Android Studio中的布局检查器,我可以看到棉花糖的分辨率为176像素,牛轧糖的分辨率为132像素(mMeasuredHeight的值相同)。您还可以看到左侧布局的其他部分保持不变(忽略小拇指向上图标) 另一个

我的三星Galaxy s7刚刚升级到Android Nougat 7.0,我注意到一些按钮的显示方式有所不同。我碰巧有另一个Galaxy s7,它还没有经过更新(棉花糖6.0.1)。我可以非常清楚地看到尺寸的差异:

棉花糖:

牛轧糖:


共享按钮的布局高度硬设置为44dp。使用Android Studio中的布局检查器,我可以看到棉花糖的分辨率为176像素,牛轧糖的分辨率为132像素(mMeasuredHeight的值相同)。您还可以看到左侧布局的其他部分保持不变(忽略小拇指向上图标)

另一个例子:

棉花糖:

牛轧糖:

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


14便士
@颜色/原色暗
@颜色/颜色文本BrightPrimary
#FFFFFF
@颜色/颜色文本BrightPrimary
@颜色/颜色文本BrightPrimary
@颜色/颜色重音
@颜色/颜色重音
@颜色/颜色重音
共享按钮是一个自定义视图,扩展了AppCompatButton,而Google和Facebook的auth按钮只是AppCompatButton。无论哪种方式,它们在更新之前看起来都不一样,代码和设备上都没有改变(文本大小和缩放相同)


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

可绘图设备可以有自己的填充。在九块PNG文件的情况下,这只是在图像的实际不透明/调整大小部分之外有透明像素。对于
ShapeDrawable
,可以直接在XML中声明填充。等等在布局检查器之类的工具中,这可能显示为“填充”,也可能不显示为“填充”,因为它们侧重于小部件上声明的填充

由于您使用的前一个背景有问题,而替换背景没有,我猜这种隐式填充就是问题所在

您有两种方法来处理此问题:

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

  • 令人恼火的方法是试图找到你以前使用过的实际按钮背景,看看它发生了什么变化。Drawable将在
    appcompat-v7
    的主题或平台的主题中声明,然后实际的Drawable本身将在
    appcompat-v7
    或平台中定义


“在Android Studio中使用布局检查器,我可以看到棉花糖的分辨率为176像素,牛轧糖的分辨率为132像素(mMeasuredHeight的值相同)”——是否有任何余量?这些利润率有变化吗?共享按钮所在的容器上是否有填充物?那个填充物变了吗?如果查看
配置
密度测量
,它们报告的密度是否发生了变化?@commonware在这两种情况下都没有余量。在这两种情况下,容器填充都等于0。但按钮的填充物确实发生了变化。牛轧糖48 40 48 40和棉花糖36 30 36 30分别用于左上右下。我没有在代码中设置填充,好吧,也许他们更改了按钮上的默认填充。这将解释部分(或许不是全部)差异。你可以试着用你的风格来定义填充,看看这有多大帮助。@commonware抱歉,我犯了一个错误,填充棉花糖48/40和牛轧糖36/30-这没有意义,是吗?为什么会有不同的高度?我试着改变填充,但正如预期的那样,它进一步加深了填充。我继续假设默认的drawable for button可能已经改变,因此产生了差异,因此我创建了自己的drawable,可以更好地控制填充和大小。这不是一个理想的解决方案,因为ripple的效果不如原始版本,因此这并不是问题的真正答案。这个主题中的任何想法或线索都将非常棒!