Android Canvas.drawText


91

Tôi có một khung nhìn, tôi đang vẽ với đối tượng Canvas trong phương thức onDraw (Canvas canvas). Mã của tôi là:

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);

Vấn đề là văn bản không hiển thị thông qua nền, tôi đang làm gì sai? Nếu tôi xóa canvas.drawPaint (sơn) và paint.setColor (android.R.color.black), bạn có thể thấy văn bản trên màn hình .....

Câu trả lời:


152

Làm việc này, hóa ra android.R.color.black không giống như Color.BLACK. Đã thay đổi mã thành:

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); 

và tất cả đều hoạt động tốt !!


35
Đúng. Nếu bạn muốn sử dụng định nghĩa màu trong res/colors.xmltệp với ID R.color.black, thì bạn không thể chỉ sử dụng ID. Nếu bạn muốn nhận được các giá trị màu sắc thực tế từ các nguồn tài nguyên, sử dụngpaint.setColor(getResources().getColor(R.color.black));
Matt Gibson

Có ai biết cách vẽ văn bản trong Android Canvas ShapeDrawable với RectShape không?
LOG_TAG

1
và để thiết lập kích thước văn bản, dpbạn có thể sử dụng như thế này
SMMousavi,

Điều quan trọng là phải đặt lại kiểu thành FILL, nếu không, nó có thể làm cho văn bản của bạn bị nét (với những đường nét có thể thực sự dày) và trông thực sự đậm và xấu.
Chase Roberts

Đây, Trong drawText ("Một số Văn bản", 10,25, sơn); nó có nghĩa là lề trái là 10 và lề trên là 25. tôi nói đúng chứ?
Hoàng tử Dholakiya

36

Cần lưu ý rằng tài liệu khuyến nghị sử dụng Layoutthay vì Canvas.drawTexttrực tiếp. Câu trả lời đầy đủ của tôi về việc sử dụng a StaticLayoutở đây , nhưng tôi sẽ cung cấp phần tóm tắt bên dưới.

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);

Dưới đây là một ví dụ đầy đủ hơn trong ngữ cảnh của một chế độ xem tùy chỉnh:

nhập mô tả hình ảnh ở đây

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();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.