Авторазмер TextView для рисования на холсте - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь отобразить текст на PDF document. Этот текст может быть длинным или коротким, но должен быть в одной строке. Вот почему я выбираю метод TextViewCompat.setAutoSizeTextTypeWithDefaults, но он не работает при рисовании на canvas. Текст обрезается, а не уменьшается.

Вот мой код:

PageInfo startingPageInfo = new Builder(STANDARD_PDF_PAGE_WIDTH, STANDARD_PDF_PAGE_HEIGHT, 1).create();
final Page startingPage = document.startPage(startingPageInfo);

Canvas canvas = startingPage.getCanvas();
canvas.save();

final TextView documentTitle = new TextView(this);
TextViewCompat.setAutoSizeTextTypeWithDefaults(documentTitle, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);
documentTitle.setLines(1);
documentTitle.setText(String.format("%s - %s", category.getName(), period));
documentTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
documentTitle.setTypeface(null, BOLD);
documentTitle.setTextColor(Color.BLACK);

int measuredWidth = MeasureSpec.makeMeasureSpec(canvas.getWidth() - 100, MeasureSpec.EXACTLY);
int measuredHeight = MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY);
documentTitle.measure(measuredWidth, measuredHeight);
documentTitle.layout(0, 0, measuredWidth, measuredHeight); 

canvas.translate(titleDx, titleDy);
documentTitle.draw(canvas);

Мне не нравятся пользовательские представления внутри Android, поэтому я, возможно, делаю что-то здесь не так, любая помощь будет признательна.

1 Ответ

0 голосов
/ 08 февраля 2019

Rewrite2 +

Проблема, с которой вы столкнулись, вызвана следующей строкой:

documentTitle.layout(0, 0, measuredWidth, measuredHeight);

Эта строка должна быть:

documentTitle.layout(0, 0, width, height);

Ваш код устанавливает ширину и высоту для некоторых астрономических значений, поэтому текст всегда "соответствует".

Это короткая демонстрация (в основном) вашего кода. Я использовал кастом LinearLayout, но это не имеет значения. Я думаю, что только вышеприведенное изменение должно работать само по себе, но я, возможно, сделал некоторые другие небольшие изменения, которые вы можете найти в приведенном ниже коде.

enter image description here

MyLinearLayout.java

public class MyLinearLayout extends LinearLayout {
    private AppCompatTextView documentTitle;

    public MyLinearLayout(@NonNull Context context) {
        super(context);
        init();
    }

    public MyLinearLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyLinearLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        documentTitle = new AppCompatTextView(this.getContext());
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        String displayString = String.format("%s - %s", "Some very, very, ", "very, very long text");

        int width = getWidth() - getPaddingEnd();
        int height = 100;

        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(width, height);
        documentTitle.setLayoutParams(lp);

        TextViewCompat.setAutoSizeTextTypeWithDefaults(documentTitle, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);
        documentTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
        documentTitle.setTypeface(null, BOLD);
        documentTitle.setTextColor(Color.BLACK);
        documentTitle.setMaxLines(1);

        int measuredWidth = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
        int measuredHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        documentTitle.measure(measuredWidth, measuredHeight);
        // Arguments here are width and height, not measureWidth and measeredHeight.
        documentTitle.layout(0, 0, width, height);

        canvas.save();
        for (int i = 0; i < 5; i++) {
            documentTitle.setText(displayString);
            documentTitle.draw(canvas);
            displayString += " - longer - longer";
            canvas.translate(0, 150);
        }
        canvas.restore();
    }

}
...