Canvas.drawText | Перенос строк | JAVA
Как сделать перенос строк при отрисовки текста? Написал функцию, которая изменяет размер, если длина текста больше ширина экрана, но это не то.
public int detectFontSize(String text, int size, int widthViewport){
Paint mp = new Paint();
mp.setAntiAlias(true);
mp.setStyle(Paint.Style.FILL);
mp.setTextSize(size);
mp.getTextBounds(text, 0, text.length(), mTextBoundRect);
float textWidth = mp.measureText(text);
int r = 0;
if(textWidth >= widthViewport){
r = detectFontSize(text, size - 1, widthViewport);
} else r = size;
return r;
}
Ответы (1 шт):
Автор решения: Sire IMPACTUS
→ Ссылка
Видимо, ответа тут я не получу. Решил проблему, написав свою функцию.
public void printDescription(Canvas linkCanvas, String text, Bitmap selectedImage) {
String[] desc = text.split(" "); //Можно изменить сепаратор, если того требует задача
ArrayList<String> arr = new ArrayList<>();
try {
Paint alertText = new Paint();
alertText.setAntiAlias(true);
alertText.setColor(Color.WHITE);
alertText.setStyle(Paint.Style.FILL);
alertText.setTextSize(24);
int active = 0;
for (int i = 0; i < desc.length; i++) {
if(arr.isEmpty()){
arr.add("");
active = 0;
}
arr.set(active, arr.get(active) + desc[i] + " ");
alertText.getTextBounds(arr.get(active), 0, arr.get(active).length(), mTextBoundRect);
float width = alertText.measureText(arr.get(active));
if (width + 150 > linkCanvas.getWidth()) {
arr.add("");
active++;
}
}
float fixOffset = 0;
float heightAlertBlock = (alertText.getTextSize() + 25f) * arr.size();
float widthAlertBlock = selectedImage.getWidth();
float[] centerAlertBlock = new float[]{widthAlertBlock / 2, heightAlertBlock / 2};
fixOffset = heightAlertBlock / arr.size();
printAlertBlock(linkCanvas, heightAlertBlock, widthAlertBlock, centerAlertBlock, selectedImage);
float start = selectedImage.getHeight() - heightAlertBlock;
float lastElement = selectedImage.getHeight() - heightAlertBlock + 25;
for(int i = 0; i < arr.size(); i++){
alertText.getTextBounds(arr.get(i), 0, arr.get(i).length(), mTextBoundRect);
float width = alertText.measureText(arr.get(i));
linkCanvas.drawText(arr.get(i), centerAlertBlock[0] - width/2, lastElement + alertText.getTextSize()/2, alertText);
lastElement += fixOffset;
}
} catch (Exception exception) {
Toast.makeText(this, "Возникла проблема! Повторите попытку позже.", Toast.LENGTH_LONG).show();
}
}
Надеюсь, что кому-то помог этим кодом.
UPD: я новичок в JAVA, поэтому не удивляйтесь, если увидели что-то несуразное.