我需要在渐变背景上显示TextView
。 TextView
本身应该是纯白色背景,文字应该是透明的。
但是,为文本设置透明色(#00000000)不起作用:它只显示白色矩形,背景不显示文本所在的位置(文本与{{颜色相同) 1}}背景)。
如何在TextView
上显示带有背景颜色的透明文字?
答案 0 :(得分:14)
我做了一个小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'
这是你如何达到这个效果的:
这是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" />
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" />
点击此处,文字颜色为黑色(不是灰色)。因此,如果您更改文本视图背景颜色,文本颜色也会更改,我认为这称为透明。对不起如果我错了。
答案 3 :(得分:-1)
将此代码添加到textview标记:
android:background="#07000000"
答案 4 :(得分:-1)
使用Textview背景执行任何操作,但要使Textview上的文本变为透明,请使用以下代码。
<TextView
...
...
android:textColor="#00000000" >
</TextView>
希望这可以帮助你...