自定义TextView以及文本绘制

3

我正在尝试实现自定义视图来显示文本,但是绘制文本时出现了问题(文本为红色,视图的背景为绿色):

enter image description here

源代码在pastebin上。


这是什么问题?你的目标是什么? - Mohamed_AbdAllah
你想通过使用TextView无法实现什么目标吗?使用或扩展现有的TextView类可以带来许多好处,包括换行和定位。 - alanv
我知道我可以使用TextView,但我需要实现自己的,这是我的任务。 - artem
5
使用 drawText 函数时,似乎 y 坐标参数指定的是文本的下边缘。因此,通过传递 0,文本的下边缘将会在视图的顶部,文本将被向上绘制(超出视图范围)。 - Sherif elKhatib
同意 @Sherif :) 可以看 http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html 获取高度。我认为上升或顶部是适合你的,但这取决于你的需求。别忘了填充(padding) :) - Tobias Ritzau
2个回答

3

您的onDraw()方法存在一些问题。由于您没有显式地更改文本对齐方式,因此文本默认左对齐。在此模式下,文本从左侧(x)向右绘制,在基线(y)上方。在您的代码中,x=0且y=0,因此文本从x=0开始向右绘制,在基线y=0之上,因此您的文本不可见。以下是您代码的修改版本:

public class FastTextView extends View {

private Context mContext;
private String mText = "";
private int mTextSize;
private Paint mPaint;

private int paddingLeft   = 0;
private int paddingRight   = 0;
private int paddingTop    = 0;
private int paddingBottom = 0;

private int fontSize = 100;

public void setText(String text)
{
    mText = text;
}

public FastTextView (Context context)
{
    super(context);
    initialize();
}

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

public void setPaddingLeft(int padding)
{
    paddingLeft = padding;
}

public void setPaddingRight(int padding)
{
    paddingRight = padding;
}

public void setPaddingBottom(int padding)
{
    paddingBottom = padding;
}

public void setPaddingTop(int padding)
{
    paddingTop = padding;
}

public void setFontSize(int size)
{
    fontSize = size;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    Rect rect = new Rect();
    mPaint.getTextBounds(mText.toString(), 0, mText.length(), rect);

    int width = Math.max(rect.width(), getSuggestedMinimumWidth()) + paddingLeft + paddingRight;
    int height = Math.max(rect.height(), getSuggestedMinimumHeight()) + paddingTop + paddingBottom;

    setMeasuredDimension(width, height);
}

/**
 * Initialize the view
 */
private void initialize()
{
    mContext = getContext();
    mPaint = new Paint();
    mPaint.setColor(Color.RED);
    mPaint.setTextSize(fontSize);
    mPaint.setTextAlign(Align.LEFT);
    setBackgroundColor(Color.GREEN);
}

@Override
protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    canvas.drawColor(Color.BLUE);
    int x = paddingLeft;
    int y = paddingTop + fontSize;

    if (mText.length() > 0) {
        canvas.drawText(mText, x, y-fontSize/4, mPaint);
    }
}

}


2

不使用(L 91)中的以下代码在视图顶部绘制文本:

canvas.drawText(mText, 0, mText.length() - 1, 0, 0, mPaint);

尝试:

canvas.drawText(mText, 0, mText.length() - 1, 0, canvas.getHeight(), mPaint);

请注意,对齐设置存储在Paint变量中。如果您的文本仍然无法正确绘制,则应更改该变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接