11

TextViewグラデーションの背景の上に表示する必要があります。それTextView自体は無地の白い背景で、テキストは透明である必要があります。

ただし、テキストに透明色 (#00000000) を設定しても機能しません。白い四角形が表示されるだけで、テキストがある場所に背景が表示されません (テキストはTextView背景と同じ色になります)。

背景色付きの透明なテキストを に表示するにはどうすればよいTextViewですか?

4

4 に答える 4

16

更新、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 実装のみであり、タイリングなどの一部の機能はサポートされていません。

于 2014-06-18T08:50:00.093 に答える
-2

次のコードを textview タグに追加します。

 android:background="#07000000"
于 2013-11-14T09:54:52.083 に答える
-2

Textviewの背景で何でもしますが、Textviewのテキストを透明にするには、以下のコードを使用します。

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

これがお役に立てば幸いです...

于 2013-11-14T10:07:05.020 に答える