Android 在安卓5.0上,小而宽的视野的阴影看起来很奇怪,但在5.1上却没有

Android 在安卓5.0上,小而宽的视野的阴影看起来很奇怪,但在5.1上却没有,android,android-5.0-lollipop,shadow,android-elevation,Android,Android 5.0 Lollipop,Shadow,Android Elevation,如果我在Android 5.0上为一个小而宽的视图添加一个仰角,阴影看起来真的很奇怪。然而,在安卓5.1上,它看起来还行。例如,请查看以下比较图像(请单击以全分辨率查看): 在5.1中,阴影的形状是均匀的,而在5.0中,阴影向屏幕边缘变薄。视图越薄(即越小),效果越明显 我不确定这是否是任何一个版本上的错误,但是我需要阴影在两个版本上看起来都像现在的5.1版本一样。这里有一个黑客的部分解决方法。阴影的形状取决于视图的高度,或者更准确地说取决于轮廓的高度。我们将设置一个自定义轮廓,如下所示: v

如果我在Android 5.0上为一个小而宽的视图添加一个仰角,阴影看起来真的很奇怪。然而,在安卓5.1上,它看起来还行。例如,请查看以下比较图像(请单击以全分辨率查看):

在5.1中,阴影的形状是均匀的,而在5.0中,阴影向屏幕边缘变薄。视图越薄(即越小),效果越明显


我不确定这是否是任何一个版本上的错误,但是我需要阴影在两个版本上看起来都像现在的5.1版本一样。

这里有一个黑客的部分解决方法。阴影的形状取决于视图的高度,或者更准确地说取决于轮廓的高度。我们将设置一个自定义轮廓,如下所示:

view.setOutlineProvider(new ViewOutlineProvider() {
    @Override
    public void getOutline(final View view, final Outline outline) {
        outline.setRect(0, -128, view.getWidth(), view.getHeight());
    }
});
不要选择
-128
任何足够大的数字(或者更好,从资源中加载维度值)。下面是它的外观:


不幸的是,这种攻击会导致在视图上方渲染奇怪的工件。但是,如果上面有另一个视图(如工具栏),则这些视图将不可见。也许可以通过将视图放在单独的布局中,并在其边界上玩来剪裁工件。

不确定它看起来有多“怪异”,请进一步解释,请查看比较图像(单击它以全分辨率查看)。在5.1版本中,阴影的形状是均匀的,而在5.0版本中,阴影向屏幕边缘变薄。在不同的操作系统版本中,阴影的渲染方式略有不同。没有面向开发人员的API可用于修改此行为。除非避免使用框架生成的阴影,否则将无法对其进行更改。