我有一个自定义的轮子选择器视图,我正如上所述。是否可以将蓝色矩形突出显示为白色的文本着色,即使只是部分?所以,如果它在文本上是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();
}
但是这只会将所有元素的文本颜色更改为白色。我觉得我离这儿很近,任何帮助都会受到赞赏!
答案 0 :(得分: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();
}
(高级)您可以在新图层/位图上渲染文字,然后将其与ColorFilter结合使用,以便进行对比。