【问题标题】:Android Canvas.drawTextAndroid Canvas.drawText
【发布时间】:2010-04-16 18:49:25
【问题描述】:

我有一个视图,我正在使用 onDraw(Canvas canvas) 方法中的 Canvas 对象进行绘图。我的代码是:

Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
canvas.drawPaint(paint);

paint.setColor(android.R.color.black);
paint.setTextSize(20);
canvas.drawText("Some Text", 10, 25, paint);

问题是文本没有通过背景显示,我做错了什么?如果我删除 canvas.drawPaint(paint) 和 paint.setColor(android.R.color.black) 你可以在屏幕上看到文字.....

【问题讨论】:

    标签: android android-canvas drawtext


    【解决方案1】:

    解决了这个问题,结果发现 android.R.color.black 与 Color.BLACK 不同。将代码更改为:

    Paint paint = new Paint(); 
    paint.setColor(Color.WHITE); 
    paint.setStyle(Style.FILL); 
    canvas.drawPaint(paint); 
    
    paint.setColor(Color.BLACK); 
    paint.setTextSize(20); 
    canvas.drawText("Some Text", 10, 25, paint); 
    

    现在一切正常!!

    【讨论】:

    • 是的。如果你想在res/colors.xml 文件中使用ID 为R.color.black 的颜色定义,那么你不能只使用ID。如果要从资源中获取实际颜色值,请使用paint.setColor(getResources().getColor(R.color.black));
    • 有人知道如何使用RectShape在Android Canvas ShapeDrawable中绘制文本吗?
    • dp中设置文本大小,您可以使用this
    • 将样式重置为 FILL 很重要,否则它可能会抚摸您的文本(可能会出现很粗的线条)并且看起来很粗且难看。
    • 这里,在 drawText("Some Text",10,25,paint);这意味着左边距是 10,上边距是 25。我说得对吗?
    【解决方案2】:

    需要注意的是documentation 建议使用Layout 而不是直接使用Canvas.drawText。我关于使用StaticLayout 的完整答案是here,但我将在下面提供一个摘要。

    String text = "This is some text.";
    
    TextPaint textPaint = new TextPaint();
    textPaint.setAntiAlias(true);
    textPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
    textPaint.setColor(0xFF000000);
    
    int width = (int) textPaint.measureText(text);
    StaticLayout staticLayout = new StaticLayout(text, textPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);
    staticLayout.draw(canvas);
    

    以下是自定义视图上下文中的更完整示例:

    public class MyView extends View {
    
        String mText = "This is some text.";
        TextPaint mTextPaint;
        StaticLayout mStaticLayout;
    
        // use this constructor if creating MyView programmatically
        public MyView(Context context) {
            super(context);
            initLabelView();
        }
    
        // this constructor is used when created from xml
        public MyView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initLabelView();
        }
    
        private void initLabelView() {
            mTextPaint = new TextPaint();
            mTextPaint.setAntiAlias(true);
            mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
            mTextPaint.setColor(0xFF000000);
    
            // default to a single line of text
            int width = (int) mTextPaint.measureText(mText);
            mStaticLayout = new StaticLayout(mText, mTextPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);
    
            // New API alternate
            //
            // StaticLayout.Builder builder = StaticLayout.Builder.obtain(mText, 0, mText.length(), mTextPaint, width)
            //        .setAlignment(Layout.Alignment.ALIGN_NORMAL)
            //        .setLineSpacing(1, 0) // multiplier, add
            //        .setIncludePad(false);
            // mStaticLayout = builder.build();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            // Tell the parent layout how big this view would like to be
            // but still respect any requirements (measure specs) that are passed down.
    
            // determine the width
            int width;
            int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            int widthRequirement = MeasureSpec.getSize(widthMeasureSpec);
            if (widthMode == MeasureSpec.EXACTLY) {
                width = widthRequirement;
            } else {
                width = mStaticLayout.getWidth() + getPaddingLeft() + getPaddingRight();
                if (widthMode == MeasureSpec.AT_MOST) {
                    if (width > widthRequirement) {
                        width = widthRequirement;
                        // too long for a single line so relayout as multiline
                        mStaticLayout = new StaticLayout(mText, mTextPaint, width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);
                    }
                }
            }
    
            // determine the height
            int height;
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int heightRequirement = MeasureSpec.getSize(heightMeasureSpec);
            if (heightMode == MeasureSpec.EXACTLY) {
                height = heightRequirement;
            } else {
                height = mStaticLayout.getHeight() + getPaddingTop() + getPaddingBottom();
                if (heightMode == MeasureSpec.AT_MOST) {
                    height = Math.min(height, heightRequirement);
                }
            }
    
            // Required call: set width and height
            setMeasuredDimension(width, height);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // do as little as possible inside onDraw to improve performance
    
            // draw the text on the canvas after adjusting for padding
            canvas.save();
            canvas.translate(getPaddingLeft(), getPaddingTop());
            mStaticLayout.draw(canvas);
            canvas.restore();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多