2

我有一个scrollViewActivity背景scrollView是多种颜色的。

<ScrollView ---------->
  <RelativeLayout -------------/>
</ScrollView>

RelativeLayout已经动态添加了视图。

膨胀的xml:

<RelativeLayout --------------android:background="some transparent image">
  <TextView --------- ---------/>
</RelativeLayout>

我希望我的文本颜色与背景颜色相同。我已经在很多方面尝试了解决方案,但未能成功。

在 iOS 中,他们使用了RSMaskedLabel(第三方类)来实现这一点,但我在 Android 中没有找到类似的东西。

我仍然没有找到任何解决方案,请任何人帮助我。我尝试使用位图和画布,但对我没有用。

在此处输入图像描述

4

1 回答 1

2

一些指南如何通过 custom 实现这一点TextView

  1. 扩展TextView组件
  2. 创建BitmapCanvas绘制背景和文本的位置
  3. 将想要的背景颜色绘制到分配中Canvas(例如Color.argb(80, 255, 255, 255)
  4. Paint使用具有模式绘制文本PorterDuffXfermode(Mode.CLEAR)(记住:仅分配一次) BitmapCanvas因为您将其绘制成Bitmap
  5. 绘制BitmapTextViews画布

以下是一些示例代码开始使用:

public class TransparentTextView extends TextView {

    private Paint mTextPaint;
    private Bitmap mBitmapToDraw;

    public TransparentTextView(Context context) {
        super(context);

        setup();
    }

    public TransparentTextView(Context context, AttributeSet attrs) {
        super(context, attrs);

        setup();
    }

    public TransparentTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        setup();
    }

    private void setup() {
        mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mTextPaint.setTextSize(getTextSize());
        mTextPaint.setStyle(Paint.Style.FILL);
        mTextPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (mBitmapToDraw == null) {
            mBitmapToDraw = Bitmap.createBitmap(getWidth(), getHeight(),
                    Bitmap.Config.ARGB_8888);

            if (mBitmapToDraw != null) {
                Canvas c = new Canvas(mBitmapToDraw);

                c.drawColor(Color.argb(80, 255, 255, 255));

                c.drawText(getText().toString(), getPaddingLeft(),
                        getPaddingTop(), mTextPaint);
            }
        }

        if (mBitmapToDraw != null) {
            canvas.drawBitmap(mBitmapToDraw, 0, 0, null);
        } else {
            super.onDraw(canvas);
        }
    }
}

如果您正在动态设置文本,则需要重置mBitmapToDraw以使其刷新。

于 2014-01-02T09:41:33.343 回答