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);
}
4
Victor Santiago 30 sierpień 2012, 06:59

2 odpowiedzi

Najlepsza odpowiedź

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.

0
Victor Santiago 6 wrzesień 2012, 03:51

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();
3
Community 23 maj 2017, 15:08