11

我需要TextView在渐变背景上显示一个。本身应该有一个纯白色的TextView背景,并且文本应该是透明的。

但是,为文本设置透明颜色 (#00000000) 不起作用:它只显示一个白色矩形,背景不会显示在文本所在的位置(文本与TextView背景颜色相同)。

如何在我的 上显示带有背景颜色的透明文本TextView

4

4 回答 4

16

更新,2016 年 1 月 30 日

我做了一个小,并根据这个答案写了一篇博文,所以你不需要复制和粘贴代码,我为你做维护。:)

使用 xml 中的视图作为:

<it.gilvegliach.android.transparenttexttextview.TransparentTextTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/view_bg"
    android:text="Hello World" />

摇篮依赖:

 compile 'it.gilvegliach.android:transparent-text-textview:1.0.3'

原始答案

这是实现该效果的方法:

  1. 您在位图上的透明背景上渲染文本
  2. 您使用该位图将文本形状从纯白色背景中裁剪出来

这是一个简单的子类TextView

final public class SeeThroughTextView extends TextView
{
    Bitmap mMaskBitmap;
    Canvas mMaskCanvas;
    Paint mPaint;

    Drawable mBackground;
    Bitmap mBackgroundBitmap;
    Canvas mBackgroundCanvas;
    boolean mSetBoundsOnSizeAvailable = false;

    public SeeThroughTextView(Context context)
    {
        super(context);

        mPaint = new Paint();
        mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_OUT));
        super.setTextColor(Color.BLACK);
        super.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }

    @Override
    @Deprecated
    public void setBackgroundDrawable(Drawable bg)
    {
        mBackground = bg;
        int w = bg.getIntrinsicWidth();
        int h = bg.getIntrinsicHeight();

        // Drawable has no dimensions, retrieve View's dimensions
        if (w == -1 || h == -1)
        {
            w = getWidth();
            h = getHeight();
        }

        // Layout has not run
        if (w == 0 || h == 0)
        {
            mSetBoundsOnSizeAvailable = true;
            return;
        }

        mBackground.setBounds(0, 0, w, h);
        invalidate();
    }

    @Override
    public void setBackgroundColor(int color)
    {
        setBackgroundDrawable(new ColorDrawable(color));
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);
        mBackgroundBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        mBackgroundCanvas = new Canvas(mBackgroundBitmap);
        mMaskBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        mMaskCanvas = new Canvas(mMaskBitmap);

        if (mSetBoundsOnSizeAvailable)
        {
            mBackground.setBounds(0, 0, w, h);
            mSetBoundsOnSizeAvailable = false;
        }
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        // Draw background
        mBackground.draw(mBackgroundCanvas);

        // Draw mask
        mMaskCanvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR);
        super.onDraw(mMaskCanvas);

        mBackgroundCanvas.drawBitmap(mMaskBitmap, 0.f, 0.f, mPaint);
        canvas.drawBitmap(mBackgroundBitmap, 0.f, 0.f, null);
    }
}

示例截图:活动背景的靛蓝图案,TextView 背景的粉红色实心填充。

这适用于纯色背景和一般可绘制对象。无论如何,这只是一个 BASIC 实现,不支持平铺等某些功能。

于 2014-06-18T08:50:00.093 回答
2

我还没有尝试过,但是您可以通过(违反所有文档建议)通过 TextView.getTextPaint() 获取 TextPaint 并调用 setXferMode(new PorterDuffXferMode(PorterDuff.Mode.MULTIPLY)) 来清除渲染时背景上的 alpha 位。

否则,实现您自己的文本视图,您可以完全控制渲染。

于 2013-11-14T09:51:22.067 回答
-2

对您的 Textview 背景做任何事情,但要使 Textview 上的文本变得透明,请使用以下代码。

<TextView
    ...
    ...
    android:textColor="#00000000" >
</TextView>

希望这可以帮助你...

于 2013-11-14T10:07:05.020 回答
-2

将此代码添加到您的 textview 标签:

 android:background="#07000000"
于 2013-11-14T09:54:52.083 回答