Атрибуты рисования не работают на холсте - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь создать белый ударный шрифт с черным контуром (он же «Meme Font»). Я применил логику для обоих текстов, которые нарисованы на холсте, но он работает только для одного из них. Вот результат, чтобы показать, о чем я говорю:

enter image description here

Вот мой код:

        Canvas canvas = new Canvas(mutableBitmap);

        TextPaint topFillPaint = new TextPaint();
        TextPaint bottomFillPaint = new TextPaint();

        TextPaint topStrokePaint = new TextPaint();
        TextPaint bottomStrokePaint = new TextPaint();

        Typeface typeface = getResources().getFont(R.font.impact);

        topFillPaint.setColor(Color.WHITE);
        topFillPaint.setTextSize(topTextView.getTextSize());
        topFillPaint.setTypeface(typeface);

        topStrokePaint.setStyle(Paint.Style.STROKE);
        topStrokePaint.setStrokeWidth(8);
        topStrokePaint.setColor(Color.BLACK);
        topStrokePaint.setTextSize(topTextView.getTextSize());
        topStrokePaint.setTypeface(typeface);

        bottomFillPaint.setColor(Color.WHITE);
        bottomFillPaint.setTextSize(bottomTextView.getTextSize());
        bottomFillPaint.setTypeface(typeface);

        bottomStrokePaint.setStyle(Paint.Style.STROKE);
        bottomStrokePaint.setStrokeWidth(8);
        bottomStrokePaint.setColor(Color.BLACK);
        bottomStrokePaint.setTextSize(bottomTextView.getTextSize());
        bottomStrokePaint.setTypeface(typeface);

        float topTextMeasurement = topFillPaint.measureText(topText);
        float bottomTextMeasurement = bottomFillPaint.measureText(bottomText);

        StaticLayout topFillLayout = new StaticLayout(topText, topFillPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER,
                1.0f, 0.0f, false);
        StaticLayout topStrokeLayout = new StaticLayout(topText, topStrokePaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER,
                1.0f, 0.0f, false);


        StaticLayout bottomFillLayout = new StaticLayout(bottomText, bottomFillPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER,
                1.0f, 0.0f, false);
        StaticLayout bottomStrokeLayout = new StaticLayout(bottomText, bottomStrokePaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER,
                1.0f, 0.0f, false);

        canvas.translate(0,0);
        topFillLayout.draw(canvas);

        canvas.translate(0,0);
        topStrokeLayout.draw(canvas);

        canvas.translate(0, canvas.getHeight() - 210);
        bottomFillLayout.draw(canvas);

        canvas.translate(0, canvas.getHeight() - 210);
        bottomStrokeLayout.draw(canvas);

UPDATE

Я прокомментировал

canvas.translate(0, canvas.getHeight() - 210); и bottomFillLayout.draw(canvas); и черная граница была нарисована. Таким образом, либо текст заливки покрывает контур, либо контур не существует при рисовании текста заливки.

1 Ответ

2 голосов
/ 13 марта 2019

Чтобы получить желаемое поведение, просто удалите второе canvas.translate(0, canvas.getHeight() - 210);.

Вызовы canvas.translate корректируют текущий перевод Canvas (он добавляет к переводу, он не сбрасывает его абсолютно). Это означает, что canvas.translate(0, 0); на самом деле не используется, потому что он вообще не меняет перевод (эти строки можно просто удалить). Перевод не сбрасывается после отрисовки вызовов, поэтому это означает, что ваш второй вызов canvas.translate(0, canvas.getHeight() - 210); переводится за пределы экрана (если только высота экрана не меньше 210 * 2).

См. документацию android.graphics.Canvas для метода перевода для получения дополнительной информации.

...