Android Canvas.drawText


91

보기가 있고 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)를 제거하면 화면에서 텍스트를 볼 수 있습니다 .....

답변:


153

이 문제를 해결 한 결과 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); 

이제 모두 잘 작동합니다 !!


35
예. res/colors.xmlID 가있는 파일 에서 색상 정의를 R.color.black사용하려면 ID 만 사용할 수 없습니다. 리소스에서 실제 색상 값을 얻으려면paint.setColor(getResources().getColor(R.color.black));
Matt Gibson

누구와 안드로이드 캔버스 쉐이프에서 텍스트를 그리는 방법을 알고 RectShape ?
LOG_TAG

1
텍스트 크기를 설정에서 dp당신은 사용할 수있는
SMMousavi

스타일을 FILL로 재설정하는 것이 중요합니다. 그렇지 않으면 텍스트가 굵은 선으로 표시되고 정말 대담하고보기 흉하게 보일 수 있습니다.
Chase Roberts

여기에서 drawText ( "Some Text", 10,25, paint); 왼쪽 여백이 10이고 위쪽 여백이 25임을 의미합니다. 맞습니까?
왕자 Dholakiya

37

있음은 주목해야한다 문서 를 사용하는 것이 좋습니다Layout 보다는를 Canvas.drawText직접. a 사용에 대한 전체 답변 StaticLayout여기 에 있지만 아래에 요약을 제공하겠습니다.

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();
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.