【发布时间】:2019-12-12 09:49:35
【问题描述】:
我创建了一个扩展 TextView 的自定义视图。我想在椭圆上使用 BlurMaskFilter,但是,除非我使用 LAYER_TYPE_SOFTWARE,否则椭圆不会像预期的那样模糊。使用 LAYER_TYPE_SOFTWARE 会正确模糊视图,但是现在它被剪裁到我想要避免的边界,因为我正在尝试创建彩色阴影效果。
奇怪的是,我只在 API 的 21-27(最小 API 为 21)上遇到了这个问题。在 API 的 28+ BlurMaskFilter 上可以与硬件加速一起正常工作,并且在视图边界之外绘制也没有问题。
LAYER_TYPE_HARDWARE API 28+ (Desired effect)
我尝试在层次结构中的所有视图上设置 clipChildren=false,但没有成功。
我还尝试根据这篇文章使用负值来增加 canvas.clipRect:https://stackoverflow.com/a/15506277/5752426 但是这似乎只在使用正值来减小绘图区域时才有效,并且在使用负值在外部绘制时不起作用查看边界。
我可以通过增加 onMeasure() 中的视图边界然后只在这些视图边界内绘制来解决这个问题,但是,这并不理想,因为我现在在定位视图时必须考虑这个额外的空间布局。此外,由于不同的视图可能具有不同的高度和阴影/模糊大小,因此问题变得不一致。
自定义视图的初始化块:
init {
this.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
setWillNotDraw(false)
...
自定义视图的onDraw:
override fun onDraw(canvas: Canvas?) {
...
if (elevation > 0f) {
circleShadowBackgroundPaint.maskFilter = circleBlurMaskFilter
canvas?.drawOval(circleBlurBackground, circleShadowBackgroundPaint)
}
...
任何帮助将不胜感激!
【问题讨论】:
标签: android android-custom-view blur clip hardware-acceleration