Android透明文本

我需要在渐变背景上显示TextViewTextView本身应该有一个普通的白色背景,文本应该是透明的。

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

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

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

Gradle依赖:

  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实现,不支持平铺等function。

我没有尝试过,但是你可以通过TextView.getTextPaint()来获取TextPaint,并调用setXferMode(PorterDuffXferMode(PorterDuff.Mode.MULTIPLY))来清除渲染时背景上的alpha位。

否则,在你完全控制渲染的地方实现你自己的文本视图。

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

在这里输入图像说明

在黑色背景下,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" /> 

在这里输入图像说明

在这里检查,这个背景的文字颜色是黑色的(不是灰色的)。 所以如果你改变你的文本视图背景颜色,文字颜色也会改变,我认为这被称为透明。 对不起,如果我错了。

用你的Textview背景做任何事情,但为了让你Textview上的文字变得透明,使用下面的代码。

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

希望这可以帮助你…

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

  android:background="#07000000"