Android Canvas.drawText


91

Bir görünümüm var, onDraw (Canvas canvas) yönteminde Canvas nesnesiyle çizim yapıyorum. Benim kodum:

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

Sorun şu ki metin arka planda görünmüyor, neyi yanlış yapıyorum? Canvas.drawPaint (paint) ve paint.setColor'u (android.R.color.black) kaldırırsam ekranda metni görebilirsiniz .....

Yanıtlar:


153

Bunu çözdüm, android.R.color.black'in Color.BLACK ile aynı olmadığı ortaya çıktı. Kodu şu şekilde değiştirdi:

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

ve şimdi hepsi iyi çalışıyor !!


35
Evet. res/colors.xmlID ile dosyadaki renk tanımını kullanmak istiyorsanız R.color.black, o zaman sadece ID'yi kullanamazsınız. Kaynaklardan gerçek renk değerini almak istiyorsanız, şunu kullanınpaint.setColor(getResources().getColor(R.color.black));
Matt Gibson

RectShape ile Android Canvas ShapeDrawable'da nasıl metin çizileceğini bilen var mı?
LOG_TAG

1
ve metin boyutunu ayarlamak için de dpsiz kullanabilirsiniz bu
SMMousavi

Stili FILL olarak sıfırlamak önemlidir, aksi takdirde metninize (potansiyel olarak gerçekten kalın çizgilerle) vuruş yapabilir ve gerçekten kalın ve çirkin görünebilir.
Chase Roberts

Burada drawText'te ("Some Text", 10,25, paint); sol kenar boşluğu 10 ve üst kenar boşluğu 25 anlamına gelir. Haklı mıyım?
Prens Dholakiya

37

Dokümantasyonun doğrudan Layoutyerine a kullanılmasını tavsiye ettiği unutulmamalıdır Canvas.drawText. Bir kullanma konusunda benim tam cevap StaticLayoutolan burada , ama ben aşağıda bir özetini sağlayacaktır.

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

İşte özel görünüm bağlamında daha kapsamlı bir örnek:

görüntü açıklamasını buraya girin

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();
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.