Android透明文字

时间:2013-11-14 09:36:02

标签: android textview transparency

我需要在渐变背景上显示TextViewTextView本身应该是纯白色背景,文字应该是透明的。

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

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

5 个答案:

答案 0 :(得分:14)

2016年1月30日更新

我做了一个小library并在此答案中写了blog post,因此您不需要复制和粘贴代码,我会为您进行维护。 :)

将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" />

Gradle依赖:

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

原始答案

这是你如何达到这个效果的:

  1. 您在位图上的透明背景上渲染文字
  2. 您使用该位图将文本形状剪裁出纯白色背景
  3. 这是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实现,不支持某些功能,如平铺。

答案 1 :(得分:2)

我没有尝试过这个,但你可以通过(反对所有文档建议)通过TextView.getTextPaint()获取TextPaint并调用setXferMode(new PorterDuffXferMode(PorterDuff.Mode.MULTIPLY))来执行此操作在渲染时清除背景上的alpha位。

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

答案 2 :(得分:1)

<TextView
        android:id="@+id/textNext2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"                
        android:gravity="center|center_vertical"
        android:text="Textview"
        android:textColor="#22000000"
        android:background="#ffffff"
        android:textSize="17dp" />

enter image description here

Textview将在黑色背景中显示如下。我希望这会对你有所帮助。

更新1:

<TextView
    android:id="@+id/textNext2"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"                
    android:gravity="center|center_vertical"
    android:text="Textview"
    android:textColor="#22000000"
    android:background="#333333"
    android:textSize="17dp" />

enter image description here

点击此处,文字颜色为黑色(不是灰色)。因此,如果您更改文本视图背景颜色,文本颜色也会更改,我认为这称为透明。对不起如果我错了。

答案 3 :(得分:-1)

将此代码添加到textview标记:

 android:background="#07000000"

答案 4 :(得分:-1)

使用Textview背景执行任何操作,但要使Textview上的文本变为透明,请使用以下代码。

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

希望这可以帮助你...