我有一个带有背景图片的布局,并在其上放置了一个按钮。按钮的背景颜色是白色。现在我想以一种方式编写文本,使文本通过它显示按钮后面的任何内容(如透明文本)。显然,如果我将文本颜色设置为透明,则文本将消失,我将看到一个没有文本的白色按钮。如何做到这一点?
截图:
![button with transparent text](https://istack.dev59.com/pIz2u.webp)
![button with transparent text](https://istack.dev59.com/pIz2u.webp)
两种方法:(1)不是很精确的解决方案,因为文本对齐应该由手动编码实现,但是:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button view1 = new Button(this);
RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1);
layout1.setBackground(getResources().getDrawable(R.drawable.choose_background));
layout1.addView(view1);
Bitmap mainImage = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
{
//creating image is not necessary, more important is ability to grab the bitmap.
Canvas canvas = new Canvas(mainImage);
canvas.drawColor(Color.WHITE);
view1.setBackground(new BitmapDrawable(getResources(), mainImage));
}
{
Canvas canvas = new Canvas(mainImage);
//most interesting part:
Paint eraserPaint = new Paint();
eraserPaint.setAlpha(0); //this
eraserPaint.setTextSize(200);
eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); //and this
canvas.drawText("some", 10, 150, eraserPaint);
}
}
eraserPaint的想法来自于这里使用PorterDuff模式擦除位图部分和这里Android如何在ImageView上应用蒙版?
在activity_main.xml中一切都是默认的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.runup.myapplication2.app.MainActivity">
结果如下:
(2) 第二种方法是将此行为添加到类中,以便在xml中使用。 https://github.com/togramago/ClearTextViewProject - 这是一个带有示例的库项目。您可以将其作为库添加或仅复制ClearTextView类到您的项目中(因为它是没有xml资源的扩展TextView)。能够适应配置更改和动态文本和/或背景更改。
纵向模式下的示例结果:
横向模式下的示例结果: