展开ViewGroup的曲面以包含文本阴影

时间:2015-08-07 19:12:30

标签: android android-layout

在Android项目中,我使用FrameLayout来包含TextView。这个TextView上有一个大阴影(提供发光)。但是,Android正在检测TextView的边界矩形只是包含文本的那个,没有阴影,因此当对象在其周围生成动画时,合成器会感到困惑。

作为一种解决方法,我尝试强制TextView拥有自己的硬件表面(使用setLayerType),但这也与文本紧密裁剪并且不考虑阴影,因此阴影被切断了。

我尝试向FrameLayout添加填充,但这不会扩展表面 - 它只会向下移动TextView并向右移动填充量。

如果我在FrameLayout上设置背景颜色,表面会扩展以覆盖其整个尺寸,但遗憾的是,即使我将其设置为0x01000000,此背景也是可见的。如果有一些方法强制它包含整个背景,即使背景颜色为0,这将是一个合适的解决方案。

扩展硬件表面以包含文本发光的最简单方法是什么?理想情况下,不会影响文本本身的位置?

1 个答案:

答案 0 :(得分:0)

诀窍是让Canvas相信每个像素都被触摸过,而实际上没有任何东西可以绘画。简单地绘制ColorDrawable不起作用,因为沿途的每一步似乎都检测到不需要渲染完全透明的颜色。并且,显然文本阴影的渲染也只是渲染画布认为它已经失效的地方 - 因此,例如,仅绘制几个背景像素将扩展表面但仍然不会导致实际文本阴影被渲染。

但是,有一项操作会导致Canvas的剪贴蒙版即使使用透明像素也会更新 - 透明Bitmap

因此,添加渲染透明Drawable的背景Bitmap会产生预期的效果。您可以添加透明位图作为资源(使用BitmapDrawable绘制),或者您可以这样做:

final Bitmap bmp = Bitmap.createBitmap(2, 2, Bitmap.Config.ALPHA_8);
final Paint bmpPaint = new Paint();
wrappingFrameLayout.setBackground(new Drawable() {
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
    public void draw(final Canvas c) {
        c.drawBitmap(bmp, null, getBounds(), bmpPaint);
    }
    public void setAlpha(final int a) {}
    public void setColorFilter(final ColorFilter cf) {}
});