Mam aplikację, w której użytkownik wstawia tekst, a kiedy klika przycisk, generuje nowy obraz z tym tekstem we wcześniej określonym obrazie i zapisuje go w telefonie.
Ale czasami ten tekst jest za długi i przekracza szerokość obrazu, więc próbuję podzielić go na nową linię. Jak mam to zrobić?
Próbowałem z breakTextem, ale nie jestem pewien, jak go używać... Używałem:
textPaint.breakText(text[2], true, bmp.getWidth(), null);
Ale to nie zadziałało.
Ponadto, kiedy ręcznie łamię linię w EditText, pokazuje wszystko tylko w jednym i z "[]", gdzie powinna zaczynać się druga linia...
EDYCJA: Mój kod oryginalny kod:
private void SaveMyImage() {
// TODO Auto-generated method stub
File myDir = new File(Environment.getExternalStorageDirectory().getPath()+"/App/");
myDir.mkdirs();
File file = new File (myDir, fname);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
Canvas canvas = new Canvas(bmp);
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
if (text[0].equals("Image 01")) {
textPaint.setColor(Color.BLACK);
}
else {
textPaint.setColor(Color.WHITE);
}
textPaint.setTextAlign(Align.CENTER);
textPaint.setTextSize(tamanho);
textPaint.setShadowLayer(2, 2, 2, Color.BLACK);
textPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); // Text Overlapping Pattern
canvas.drawBitmap(bmp, 0, 0, null);
canvas.drawText(text[1], largura, altura2, textPaint);
canvas.drawText(text[2], largura, altura, textPaint);
bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
Toast.makeText(SaveIMG.this, "Image saved on phone", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/App/"+fname);
pronto.setImageURI(uri);
}
2 odpowiedzi
Znalazłem rozwiązanie, stworzyłem układ i ustawiłem ciąg jako widok tekstu, a obraz jako tło i narysowałem go.
breatText zwraca liczbę znaków w łańcuchu, który może zostać wyświetlony przed odcięciem. Sugerowałbym wywołanie tego w pętli. Usunięcie dowolnej liczby znaków, które może zmieścić i umieszczenie ich w ciągu każdej iteracji, aż tekst źródłowy będzie pusty.:
ArrayList<String> lines = new ArrayList<String>();
String test = text[2];
while(!test.isEmpty()){
int newLength = textPaint.breakText(test, true, bmp.getWidth(), null);
lines.add(test.substring(0, newLength));
test = test.substring(newLength);
}
Co do drukowania wielu linii. Zakładam, że używasz Canvas.drawText, który wydaje się nie obsługiwać łamania wierszy. Musisz więc narysować każdą linię osobno z różnymi wartościami Y. (Kod dostosowany stąd):
Rect bounds = new Rect();
int yoff = 0;
for(String line:lines){
canvas.drawText(line, x, y + yoff, paint);
textPaint.getTextBounds(line, 0, line.length(), bounds);
yoff += bounds.height();
}
EDYTUJ Nie widzę w twoim kodzie, gdzie faktycznie dzielisz ciągi, jak opisałem. Nie mogę zdiagnozować, dlaczego moje rozwiązanie nie zadziałało, jeśli nie pokażesz mi, jak je zaimplementowałeś.
Pracując stąd, myślę, że mogę pokazać, jak naprawić błąd. Jeśli chcesz to zrobić wiele razy, dobrym pomysłem byłoby napisanie na to metody. Dodaj następującą metodę do swojej klasy:
public void splitAndDrawLines(Canvas canvas,String text, int x, int y, Paint textPaint, int width){
ArrayList<String> lines = new ArrayList<String>();
String test = text;
while(!test.isEmpty()){
int newLength = textPaint.breakText(test, true, canvas.getWidth(), null);
lines.add(test.substring(0, newLength));
test = test.substring(newLength);
}
Rect bounds = new Rect();
int yoff = 0;
for(String line:lines){
canvas.drawText(line, x, y + yoff, textPaint);
textPaint.getTextBounds(line, 0, line.length(), bounds);
yoff += bounds.height();
}
}
Wymień ten kod:
canvas.drawText(text[1], largura, altura2, textPaint);
canvas.drawText(text[2], largura, altura, textPaint);
Za pomocą tego kodu:
this.splitAndDrawLines(canvas, text[1], largura, altura2, textPaint);
this.splitAndDrawLines(canvas, text[2], largura, altura, textPaint);
EDYCJA 2:
Oto kod, którego użyłem do skonfigurowania i napisania kodu:
// Create a 100x100 bitmap
bmp = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
// Set the height of the text to 12.
this.tamanho = 12f;
// Draw the text in the middle of the picture width-wise.
this.largura = bmp.getWidth() / 2;
// Text parameters
this.text = new String[]{"MAKE THE TEXT WHITE", "This text starts in the middle of the middle is too long and will be split","Short text at the top of the image"};
// Start one line size into the picture height-wise.
this.altura = this.tamanho;
// Start in the middle of the picture height-wise.
this.altura2 = bmp.getHeight()/2;
// Output File name.
this.fname = "TEST.jpg";
// Save the image
SaveMyImage();
Podobne pytania
Nowe pytania
android
Android to mobilny system operacyjny Google, używany do programowania lub tworzenia urządzeń cyfrowych (smartfony, tablety, samochody, telewizory, Wear, Glass, IoT). W przypadku tematów związanych z Androidem użyj tagów specyficznych dla Androida, takich jak android-intent, android-activity, android-adapter itp. W przypadku pytań innych niż programowanie lub programowanie, ale związanych ze strukturą Androida, użyj tego linku: https: // android.stackexchange.com.