android中Textview的屏蔽属性

android中Textview的屏蔽属性,android,transparentproxy,Android,Transparentproxy,我的活动中有一个滚动视图,滚动视图的背景有多种颜色 <ScrollView ----------> <RelativeLayout -------------/> </ScrollView> 我希望我的文字颜色与背景颜色相同。我尝试了很多方法来解决这个问题,但都没有成功 在iOS中,为了实现这一点,他们使用了RSMaskedLabel(第三方类),但我在Android中没有发现类似的东西 我仍然没有找到任何解决办法,谁能帮我一下吗。我尝试使用位图和画布,

我的
活动中有一个
滚动视图
滚动视图
的背景有多种颜色

<ScrollView ---------->
  <RelativeLayout -------------/>
</ScrollView>
我希望我的文字颜色与背景颜色相同。我尝试了很多方法来解决这个问题,但都没有成功

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

我仍然没有找到任何解决办法,谁能帮我一下吗。我尝试使用位图和画布,但对我不起作用


如何使用自定义
文本视图实现此目的的一些指导原则:

  • 扩展
    TextView
    组件
  • 在绘制背景和文本的位置创建
    位图
    画布
  • 将所需背景色绘制到分配的
    画布中
    (例如
    color.argb(80255 255 255)
  • 使用
    Paint
    have mode
    PorterDuffXfermode(mode.CLEAR)
    (记住:只分配
    Bitmap
    Canvas
    一次),因为您将文本绘制到
    Bitmap
  • 位图
    绘制到
    文本视图
    画布中
  • 以下是一些开始使用的示例代码:

    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);
            }
        }
    }
    

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

    我认为您无法使用标准的Android API进行此操作。所以你必须想出你自己的办法。如果您在编写代码方面有问题,可以回到这里寻求代码方面的帮助。我在Github中看到了iOS的第三方类RSMaskedLabel,但我没有找到android的任何内容。我尝试过给Textview透明,但没有成功。这是Github的链接。你能提供任何示例来解释所有这些吗?我用最少的代码制作了组件。这里不支持文本对齐,但您可以通过检查重力、测量文本高度和宽度与视图大小等来实现。这对我不起作用,文本不显示。唯一透明的矩形图像是dispalyedWhat平台和设备?Galaxy nexus,Android 4.2
    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);
            }
        }
    }