Как настроить переход на новую строку при вызове drawtext()?

Это поле списка.

public class Custom_ListField extends ListField {
private String[] title, category, date, imagepath;
private int[] newsid, catsid;
private List_News newslist;
private Bitmap imagebitmap[], localimage = Bitmap
        .getBitmapResource("image_base.png");
private BrowserField webpage;
private Custom_BrowserFieldListener listener;
private boolean islatest;

private Vector content = null;
private ListCallback callback = null;

private int currentPosition = 0;

public Custom_ListField(Vector content, boolean islatest) {
    this.content = content;
    this.islatest = islatest;
    newsid = new int[content.size()];
    title = new String[content.size()];
    category = new String[content.size()];
    date = new String[content.size()];
    imagepath = new String[content.size()];
    catsid = new int[content.size()];
    imagebitmap = new Bitmap[content.size()];

    for (int i = 0; i < content.size(); i++) {
        newslist = (List_News) content.elementAt(i);
        newsid[i] = newslist.getID();
        title[i] = newslist.getNtitle();
        category[i] = newslist.getNewCatName();
        date[i] = newslist.getNArticalD();
        imagepath[i] = newslist.getImagePath();

        if (!imagepath[i].toString().equals("no picture")) {
            imagebitmap[i] = Util_ImageLoader.loadImage(imagepath[i]);
        } else {
            imagebitmap[i] = localimage;
        }
        catsid[i] = newslist.getCatID();
    }

    initCallbackListening();
    this.setRowHeight(localimage.getHeight() + 10);
}

private void initCallbackListening() {
    callback = new ListCallback();
    this.setCallback(callback);
}

private class ListCallback implements ListFieldCallback {

    public ListCallback() {
        setBackground(Config_GlobalFunction
                .loadbackground("background.png"));
    }

    public void drawListRow(ListField listField, Graphics graphics,
            int index, int y, int width) {
        currentPosition = index;
        graphics.drawBitmap(
                Display.getWidth() - imagebitmap[index].getWidth() - 5,
                y + 3, imagebitmap[index].getWidth(),
                imagebitmap[index].getHeight(), imagebitmap[index], 0, 0);
        graphics.setColor(Color.WHITE);
        graphics.drawRect(0, y, width, imagebitmap[index].getHeight() + 10);



        graphics.setColor(Color.BLACK);
        graphics.setFont(Font.getDefault().derive(Font.BOLD, 20));
        graphics.drawText(title[index], 5, y + 3, 0, Display.getWidth()
                - imagebitmap[index].getWidth() - 10);

        graphics.setColor(Color.GRAY);
        graphics.setFont(Font.getDefault().derive(Font.BOLD, 15));
        graphics.drawText(date[index], 5, y + 6
                + Font.getDefault().getHeight() + 3);

        if (islatest) {
            graphics.setColor(Color.RED);
            graphics.setFont(Font.getDefault().derive(Font.BOLD, 15));
            graphics.drawText(category[index], Font.getDefault()
                    .getAdvance(date[index]) + 3, y + 6
                    + Font.getDefault().getHeight() + 3);
        }
    }

    public Object get(ListField listField, int index) {
        return content.elementAt(index);
    }

    public int getPreferredWidth(ListField listField) {
        return Display.getWidth();
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        return content.indexOf(prefix, start);
    }
}

public int getCurrentPosition() {
    return currentPosition;
}

protected boolean navigationClick(int status, int time) {
    int index = getCurrentPosition();
    if (catsid[index] == 9) {
        if (Config_GlobalFunction.isConnected()) {
            webpage = new BrowserField();
            listener = new Custom_BrowserFieldListener();
            webpage.addListener(listener);

            MainScreen aboutus = new Menu_Aboutus();
            aboutus.add(webpage);
            Main.getUiApplication().pushScreen(aboutus);

            webpage.requestContent("http://www.orientaldaily.com.my/index.php?option=com_k2&view=item&id="
                    + newsid[index] + ":&Itemid=223");
        } else
            Config_GlobalFunction.Message(Config_GlobalFunction.nowifi, 1);
    } else
        Main.getUiApplication().pushScreen(
                new Main_NewsDetail(newsid[index]));
    return true;
}
}

Пожалуйста, посмотрите на

graphics.setColor(Color.BLACK);
graphics.setFont(Font.getDefault().derive(Font.BOLD, 20));
graphics.drawText(title[index], 5, y + 3, 0, Display.getWidth()
                - imagebitmap[index].getWidth() - 10);

Это будет рисовать только одну строку текста. Я исследовал и обнаружил, что встроенной функции нет, и я должен настроить функцию, чтобы текст автоматически переходил на следующую строку.

Функция примерно такая

private int numberoflines(int availablespace){
    ...
    return numberlines
}

person Alan Lai    schedule 18.07.2012    source источник
comment
Проверьте этот ответ - stackoverflow.com/q/7912880/431639. Также проверьте это, supportforums.blackberry.com/t5/Java-Development/.   -  person Rupak    schedule 18.07.2012


Ответы (1)


Ссылки, которые показывает Рупак, хороши, хотя одна из них ссылается на общую проблему Java (и предлагает результат Swing, который необходимо изменить для BlackBerry), а другая ссылается на внешнюю ссылку (без переполнения стека).

Если вам нужен другой вариант и вы не хотите, чтобы алгоритм определял, где делать разрывы строк, вы можете использовать этот. Этот код предполагает, что вы помещаете символы '\n' в свои строки, где вы хотите разбить текст на несколько строк. Вы, вероятно, поместите этот код в метод paint():

     // store original color, to reset it at the end
     int oldColor = graphics.getColor();

     graphics.setColor(Color.BLACK);
     graphics.setFont(_fieldFont);
     int endOfLine = _text.indexOf('\n'); 
     if (endOfLine < 0) {
        graphics.drawText(_text, _padding, _top);
     } else {
        // this is a multi-line label
        int top = _top;
        int index = 0;
        int textLength = _text.length();
        while (index < textLength) {
           // draw one line at a time
           graphics.drawText(_text,
                 index,             // offset into _text
                 endOfLine - index, // number of chars to draw
                 _padding,          // x
                 top,               // y
                 (int) (DrawStyle.HCENTER | DrawStyle.TOP | Field.USE_ALL_WIDTH), // style flags
                 _fieldWidth - 2 * _padding);                                     // width available

           index = endOfLine + 1;
           endOfLine = _text.indexOf('\n', index); 
           if (endOfLine < 0) {
               endOfLine = textLength;
           }
           top += _fieldFont.getHeight() + _top;  // top padding is set equal to spacing between lines
        }
     }

     graphics.setColor(oldColor);

И здесь вы должны инициализировать некоторые переменные, которые я использую в этом. Я думаю, что они верны, основываясь на опубликованном вами коде, но вам нужно перепроверить:

     String _text = title[index];   // text to draw
     int _padding = 5;              // left and right side padding around text
     int _top = y + 3;              // the y coordinate of the top of the text

     Font _fieldFont = Font.getDefault().derive(Font.BOLD, 20);

     // the total width reserved for the text, which includes room for _padding:
     int _fieldWidth = Display.getWidth() - imagebitmap[index].getWidth();
person Nate    schedule 18.07.2012
comment
это не работает, текст все равно перекрывает изображение. Это поддерживает текст utf-8? мой текст китайское слово. - person Alan Lai; 19.07.2012
comment
@AlanLai, я думал, твоя проблема в том, что тебе нужно отображать текст более чем в одной строке? Приведенный выше код просто разбивает текст с символами '\n' внутри на более чем одну строку. Он ничего не делает с рисованием растровых изображений. Если текст неправильно перекрывает растровое изображение, значения x и y, передаваемые в drawText(), должны быть неверными. В моем примере это значения _padding и top. Взгляните на них и переместите их, пока они не окажутся поверх вашего изображения. Я не уверен насчет символов drawText() и UTF-8. Но это тот же метод, который вы использовали в вопросе. - person Nate; 19.07.2012
comment
Я понимаю. Мне нужна функция, которая будет рисовать тексты в несколько строк и возвращать высоту текстов. - person Alan Lai; 19.07.2012
comment
@AlanLai, вам нужна высота как (1) общее количество пикселей или (2) как количество строк? Если вам нужно общее количество пикселей, вам нужно просто количество строк, умноженное на высоту шрифта, или вы хотите, чтобы результат включал вертикальные отступы/расстояния между строками? - person Nate; 19.07.2012
comment
это то, что я хочу. Посмотрите на черный текст рядом с изображением. Это было title[index] - person Alan Lai; 19.07.2012
comment
@AlanLai, хорошо, я вижу текст, который занимает 3 строки. Это нормально. Почему код, который я разместил, не делает этого? Вы поместили символы '\n' в строку title[index], как я сказал в своем ответе выше? Код ищет '\n', поэтому в строке должны быть введены новые строки, чтобы код рисовал более одной строки. Если вы хотите, чтобы код определял, где размещать разрывы строк, дайте мне знать... это не то, что делает приведенный выше код. - person Nate; 19.07.2012
comment
Это проблема. Я не уверен, какой текст будет последним символом строки. Идея заключается в том, что текст рисуется до тех пор, пока не обнаружит, что доступное пространство не может поместиться в следующий символ, затем автоматически вставьте \n и продолжите рисование. Я не уверен, что вы понимаете или нет. Это можно сделать в Android, потому что по умолчанию подойдет. - person Alan Lai; 19.07.2012
comment
@AlanLai, я не знаю китайского. Каковы правила разрыва строки? Можно ли сделать перерыв между любыми двумя символами? Вам нужно разбивать только на пробелы, как в английском? - person Nate; 19.07.2012
comment
предположим, что это String "1234567890 abcdefghijklmn" как title[index]. Просто относитесь к whitespace как к символу. Когда width не может нарисовать следующий символ, вставьте \n и начните со следующей строки. - person Alan Lai; 19.07.2012
comment
Я просто использую этот пример. Он работает с размером шрифта по умолчанию, но не с пользовательским размером шрифта. - person Alan Lai; 19.07.2012
comment
@AlanLai, тебе все еще нужна помощь? Или пример, который вы связали, решил вашу проблему? - person Nate; 20.07.2012
comment
на самом деле решена наполовину, пример рассчитывается с размером шрифта по умолчанию. Вычисление пошло не так, когда я установил собственный размер шрифта. Надеюсь, вы поможете мне настроить функцию, приняв пользовательский размер шрифта. - person Alan Lai; 20.07.2012
comment
@AlanLai, конечно ... позвольте мне изменить код, теперь, когда я понимаю, что вам нужно. - person Nate; 20.07.2012
comment
Я использую ответ с getsplitindex(). - person Alan Lai; 20.07.2012