我可以在Android中部分更改此文本的颜色吗?

时间:2016-05-16 09:38:40

标签: java c# android xml xamarin.android

enter image description here

我有一个自定义的轮子选择器视图,我正如上所述。是否可以将蓝色矩形突出显示为白色的文本着色,即使只是部分?所以,如果它在文本上是50%,它会将其中的一半变为白色,一半变为黑色?

修改

我正在使用Java代码(移植到C#):https://code.google.com/archive/p/android-wheel/

基本上,蓝色矩形是xml定义的形状,我将其放在代码中的可滚动文本后面。

然后我使用以下代码绘制矩形和顶部的项目:

/**
     * Draws items
     * @param canvas the canvas for drawing
     */
    private void drawItems(Canvas canvas)
    {
        canvas.Save();

        int top = (currentItem - firstItem) * getItemHeight() + (getItemHeight() - this.Height) / 2;
        canvas.Translate(PADDING, -top + scrollingOffset);

        itemsLayout.Draw(canvas);

        canvas.Restore();
    }

    /**
     * Draws rect for current value
     * @param canvas the canvas for drawing
     */
    private void drawCenterRect(Canvas canvas)
    {
        int center = this.Height / 2;
        int offset = (int)(getItemHeight() / 2 * 1.2);
        centerDrawable.SetBounds(0, center - offset, this.Width, center + offset);
        centerDrawable.Draw(canvas);
    }

据我所知,矩形本身没有文本属性来设置高亮或ColorPrimaryInverse等属性。

编辑2:

据我所知,我需要在重写onDraw中使用Volodymyr的代码来构成我控制的每个TextView。这就是我到目前为止所做的:

protected override void OnDraw(Canvas canvas)
    {
        Rect rect = new Rect();
        this.GetDrawingRect(rect);

        Paint mpaint = new Paint();
        mpaint.Color = Color.Black;
        mpaint.SetStyle(Style.Fill);

        canvas.Save();
        canvas.ClipRect(rect, Region.Op.Difference);
        this.SetTextColor(Color.Black);
        base.OnDraw(canvas);
        canvas.Restore();


        mpaint.Color = Color.White;
        canvas.Save();
        canvas.ClipRect(rect, Region.Op.Replace); // lets draw inside center rect only
        this.SetTextColor(Color.White);
        base.OnDraw(canvas);
        canvas.Restore();
    }

但是这只会将所有元素的文本颜色更改为白色。我觉得我离这儿很近,任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点或类似的事情:

  1. 您可以使用Canvas.clipRect方法,传递选择矩形并使用其他颜色渲染文本。所以你的代码就像:

    private draw(Canvas canvas)
    {
      RectF centerRect = new RectF(....); // change to your values
    
      drawCenterRect(canvas);
    
      canvas.save();
      canvas.clipRect(centerRect, Region.Op.DIFFERENCE); // lets draw everywhere except center rect
      drawItems(canvas, Color.BLACK); // Pass color outside selection
      canvas.restore();
    
      canvas.save();
      canvas.clipRect(centerRect, Region.Op.REPLACE); // lets draw inside center rect only
      drawItems(canvas, Color.WHITE); // Pass color inside selection
      canvas.restore();
    }
    
  2. (高级)您可以在新图层/位图上渲染文字,然后将其与ColorFilter结合使用,以便进行对比。