Android Canvas.drawText

91

Saya memiliki pandangan, saya menggambar dengan objek Canvas dalam metode onDraw (Canvas canvas). Kode saya adalah:

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

Masalahnya adalah teks tidak muncul melalui latar belakang, apa yang saya lakukan salah? Jika saya menghapus canvas.drawPaint (paint) dan paint.setColor (android.R.color.black) Anda dapat melihat teks di layar .....

Gaz
sumber

Jawaban:

153

Mengerjakan ini, ternyata android.R.color.black tidak sama dengan Color.BLACK. Mengubah kode menjadi:

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

dan semuanya bekerja dengan baik sekarang !!

Gaz
sumber
35
Iya. Jika Anda ingin menggunakan definisi warna dalam res/colors.xmlfile dengan ID R.color.black, Anda tidak bisa hanya menggunakan ID. Jika Anda ingin mendapatkan nilai warna sebenarnya dari sumber daya, gunakanpaint.setColor(getResources().getColor(R.color.black));
Matt Gibson
Ada yang tahu cara menggambar teks di Android Canvas ShapeDrawable dengan RectShape ?
LOG_TAG
1
dan untuk mengatur ukuran teks dpAnda dapat menggunakan seperti ini
SMMousavi
Sangat penting untuk mengatur ulang gaya ke ISI, jika tidak maka akan menggores teks Anda (dengan kemungkinan garis yang sangat tebal) dan terlihat sangat tebal dan jelek.
Chase Roberts
Di sini, Dalam drawText ("Some Text", 10,25, paint); itu berarti margin kiri 10 dan margin atas 25. apakah saya benar?
Pangeran Dholakiya
37

Perlu dicatat bahwa dokumentasi merekomendasikan penggunaan a Layoutdaripada Canvas.drawTextsecara langsung. Jawaban lengkap saya tentang penggunaan a StaticLayoutada di sini , tetapi saya akan memberikan ringkasan di bawah.

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

Berikut adalah contoh yang lebih lengkap dalam konteks tampilan kustom:

masukkan deskripsi gambar di sini

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();
    }
}
Suragch
sumber