text渲染实体rect,但不会渲染渐变

时间:2015-02-23 19:16:22

标签: java android

我是Android开发的新手,并试图在onDraw方法中向Canvas对象渲染一个按钮,基本上是在后场发短信。这是使用一些渲染命令让我的脚湿透的好方法。

我可以填充一个实心矩形,然后在其上绘制居中文本,但是当我尝试填充渐变矩形,然后在其上绘制文本时,文本不会绘制。

代码在下面,从各种示例拼凑而成。基本上是:

  • DO_PAINT = 0,DO_GRADIENT = 0 - >文字渲染
  • DO_PAINT = 1,DO_GRADIENT = 0 - >顶部带有文字的实心矩形
  • DO_PAINT = 0,DO_GRADIENT = 1 - >渐变矩形(无文字)!!!

因此我的渐变绘图会干扰我的文字渲染。我猜测我在Paint对象中留下了一个状态不好的东西,但是我不确定那个属性是什么......

非常感谢任何见解或想法......

import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.view.View;
import android.graphics.Paint;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Canvas;
import android.util.Log;
import android.view.MotionEvent;
import android.app.Activity;

public class cMyView extends View
{
    public cMyView(Context context, Activity owner_activity)
    {
        super(context);
    }

    final Paint m_paint = new Paint();
    public String m_Text = "Button";
    private final Rect textBounds = new Rect(); 
    public Typeface m_TypeFace = Typeface.create("Arial",Typeface.NORMAL);
    public int m_TextColor = Color.argb(255,0,0,0);
    public int m_TextSize = 32;

    @Override
    protected void onDraw(Canvas canvas) {

        Rect m_Bounds = new Rect(100,100,500,200);
        boolean DO_PAINT = false;
        boolean DO_GRADIENT = true;


    if ( DO_PAINT) {
        m_paint.setStyle(Paint.Style.FILL);
        m_paint.setColor(Color.GREEN);
        canvas.drawRect(m_Bounds, m_paint);
    }

    if (DO_GRADIENT) {
        m_paint.setShader(new LinearGradient(0, m_Bounds.top, 0, m_Bounds.bottom, Color.BLACK, Color.WHITE, Shader.TileMode.MIRROR));
        canvas.drawRect(m_Bounds.left, m_Bounds.top, m_Bounds.right, m_Bounds.bottom, m_paint);
    }

    m_paint.setColor(m_TextColor);
    m_paint.setTextSize(m_TextSize);
    m_paint.setTypeface(m_TypeFace);

    m_paint.getTextBounds(m_Text, 0, m_Text.length(), textBounds);

    double x = m_Bounds.left + m_Bounds.width()/2  - textBounds.exactCenterX();
    double y = m_Bounds.top  + m_Bounds.height()/2 - textBounds.exactCenterY();

    canvas.drawText(m_Text, (float) x, (float) y, m_paint);

}

}

1 个答案:

答案 0 :(得分:1)

只需添加另一个Paint for text,这对我有用,我找到了原因,如果你在DO_GRADIENT案例(在你的代码中)中注释第二行,那么会看到该文本是渐变的,这意味着它绘制,但具有与背景相同的渐变,并变得不可见。

public class CustomView extends View {
public CustomView(Context context) {
    super(context);
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

final Paint m_paint = new Paint();
public String m_Text = "Button";
private final Rect textBounds = new Rect();
public Typeface m_TypeFace = Typeface.create("Arial",Typeface.NORMAL);
public int m_TextColor = Color.argb(255, 0, 0, 0);
public int m_TextSize = 32;
private final Paint textPaint = new Paint();

@Override
protected void onDraw(Canvas canvas) {

    Rect m_Bounds = new Rect(100,100,500,200);
    boolean DO_PAINT = true;
    boolean DO_GRADIENT = true;


    if ( DO_PAINT) {
        m_paint.setStyle(Paint.Style.FILL);
        m_paint.setColor(Color.GREEN);
        canvas.drawRect(m_Bounds, m_paint);
    }

    if (DO_GRADIENT) {
        m_paint.setShader(new LinearGradient(0, m_Bounds.top, 0, m_Bounds.bottom, Color.BLACK, Color.WHITE, Shader.TileMode.MIRROR));
        canvas.drawRect(m_Bounds.left, m_Bounds.top, m_Bounds.right, m_Bounds.bottom, m_paint);
    }

    m_paint.setColor(m_TextColor);
    m_paint.setTextSize(m_TextSize);
    m_paint.setTypeface(m_TypeFace);

    m_paint.getTextBounds(m_Text, 0, m_Text.length(), textBounds);

    double x = m_Bounds.left + m_Bounds.width()/2  - textBounds.exactCenterX();
    double y = m_Bounds.top  + m_Bounds.height()/2 - textBounds.exactCenterY();

    textPaint.setColor(m_TextColor);
    textPaint.setTextSize(m_TextSize);
    textPaint.setTypeface(m_TypeFace);
    canvas.drawText(m_Text, (float) x, (float) y, textPaint);

}

Screenshot