Текстовый текст Android

Мне нужно отобразить TextView на фоне градиента. Сам TextView должен иметь простой белый фон, а текст должен быть прозрачным.

Однако установка прозрачного цвета (# 00000000) в текст не работает: он отображает только белый прямоугольник, фон не отображается там, где текст (текст имеет тот же цвет, что и TextView фон).

Как я могу отобразить прозрачный текст с цветом фона на моем TextView?

Ответ 1

Обновление, 30 января 2016 г.

Я сделал небольшую библиотеку и написал сообщение в блоге из этого ответа, поэтому вам не нужно копировать и вставлять код, и я делаю это для вас.:)

Используйте представление в 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 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.

WZWls.png

Это работает как для сплошных фоновых цветов, так и для общих чертежей. Во всяком случае, это только реализация BASIC, некоторые функции, такие как тайлинг, не поддерживаются.

Ответ 2

Я не пробовал это, но вы могли бы сделать это (против всех рекомендаций по документации), получая TextPaint через TextView.getTextPaint() и вызывая setXferMode (новый PorterDuffXferMode (PorterDuff.Mode.MULTIPLY)), чтобы для очистки альфа-бит на фоне при рендеринге.

В противном случае реализуйте свое собственное текстовое представление, где вы полностью контролируете рендеринг.

Ответ 3

<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

Отметьте здесь, цвет текста черный (не серый) с этим фоном. Поэтому, если вы измените цвет фона в текстовом режиме, цвет текста также изменится, я думаю, что это называется прозрачным. Извините Если я ошибаюсь.

Ответ 4

делать что-либо с вашим фоном Textview, но чтобы текст в Textview стал прозрачным, используйте приведенный ниже код.

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

Надеюсь, это поможет вам...

Ответ 5

Добавьте этот код в свой тег textview:

 android:background="#07000000"