自动调整 TextView 大小以在 canvas 上绘制
Autosizing TextView to draw on canvas
我尝试在 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 中的自定义视图感到不满意,所以我可能在这里做错了什么,我们将不胜感激。
重写2+
您遇到的问题是由以下行引起的:
documentTitle.layout(0, 0, measuredWidth, measuredHeight);
这一行应该是:
documentTitle.layout(0, 0, width, height);
您的代码将宽度和高度设置为一些天文值,因此文本始终 "fits."
这是(大部分)代码工作的简短演示。我使用了自定义 LinearLayout
但这无关紧要。我认为上面的更改本身就应该有效,但我可能还做了一些其他小调整,您可能会在下面的代码中找到它们。
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();
}
}
我尝试在 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 中的自定义视图感到不满意,所以我可能在这里做错了什么,我们将不胜感激。
重写2+
您遇到的问题是由以下行引起的:
documentTitle.layout(0, 0, measuredWidth, measuredHeight);
这一行应该是:
documentTitle.layout(0, 0, width, height);
您的代码将宽度和高度设置为一些天文值,因此文本始终 "fits."
这是(大部分)代码工作的简短演示。我使用了自定义 LinearLayout
但这无关紧要。我认为上面的更改本身就应该有效,但我可能还做了一些其他小调整,您可能会在下面的代码中找到它们。
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();
}
}