Как создать CustomLabelField, который подходит для всех версий BlackBerry? - PullRequest
0 голосов
/ 23 октября 2009

Я создал собственное поле пользовательского ярлыка, используя это поле пользовательского ярлыка, я могу изменять цвет фона, цвет шрифта, ширину и высоту ... Когда я использую это поле метки в версии 4.6, я могу получить ожидаемый результат, например, если текст не является набором в одну строку, тогда он автоматически переходит ко второй строке, но если я использую то же самое в версии 4.5, текст не переходит на следующую строку, а вместо этого иногда он показывает половину текста, а иногда даже не показывает одну строку. У вас есть идея, чтобы решить эту проблему, пожалуйста, поделитесь со мной.

1 Ответ

2 голосов
/ 30 октября 2009

Моя реализация управления кнопками будет:

  • имеют фиксированный размер, шрифт и смещение текста
  • если метка не может поместиться в одну строку, показать метку в несколько строк максимальной ширины
  • если больше строк не умещается, показать многоточие в конце строки

альтернативный текст http://img297.imageshack.us/img297/8360/multilinebuttons.jpg
Пользовательский код кнопки:

class CustomButton extends ButtonField {
 int mHeight;
 int mWidth;
 int LEFT_OFFSET = 2;
 int TOP_OFFSET = 2;

 public CustomButton(int height, int width, String label) {
  super(label, CONSUME_CLICK);
  mHeight = height;
  mWidth = width;
  setFont(getFont().derive(Font.PLAIN, 16));
 }

 public int getPreferredHeight() {
  return mHeight;
 }

 public int getPreferredWidth() {
  return mWidth;
 }

 protected void layout(int width, int height) {
  super.layout(mWidth, mHeight);
  setExtent(mWidth, mHeight);
 }

 protected void paint(Graphics graphics) {
  int textHeight = getFont().getHeight();
  int twoLinesHeight = 2 * textHeight + TOP_OFFSET;
  // check if first line fit in button height
  int fitHeight = mHeight - 2 * TOP_OFFSET;
  if (textHeight <= fitHeight) {
   graphics.setColor(Color.WHITE);
   String label = getLabel();
   int textLenght = getFont().getAdvance(label);
   // check if whole label fit in button width
   int fitWidth = mWidth - 2 * LEFT_OFFSET;
   if (textLenght <= fitWidth) {
    graphics.drawText(label, LEFT_OFFSET, TOP_OFFSET);
   } else {
    Vector lines = splitLabelToLines();
    int lineTopOffset = TOP_OFFSET;
    int linesCount = lines.size();
    for (int i = 0; i < linesCount; i++) {
     String line = (String) lines.elementAt(i);

     // if lines will not fit in button height, draw ellipsis
     int moreLinesHeight = lineTopOffset + twoLinesHeight;
     boolean moreLinesFit = moreLinesHeight <= fitHeight;
     boolean lastLine = (i == linesCount - 1);
     if (moreLinesFit || lastLine) {
      graphics.drawText(line, LEFT_OFFSET, lineTopOffset);
      lineTopOffset += TOP_OFFSET + textHeight;
     } else {
      line += "...";
      int lineLenght = getFont().getAdvance(line);
      if (lineLenght > fitWidth) {
       int len = Math.max(0, line.length() - 6);
       line = line.substring(0, len) + "...";
      }
      graphics.drawText(line, LEFT_OFFSET, lineTopOffset);
      break;
     }
    }
   }
  }
 }

 private Vector splitLabelToLines() {
  int fitWidth = mWidth - 2 * LEFT_OFFSET;
  String label = getLabel();
  int lbLen = label.length();
  Vector lines = new Vector();
  int begin = 0;
  // while there are more chars in label
  while (begin < lbLen - 1) {
   // new line
   String lnText = "";
   // line width in pixels
   int lnWidth = 0;
   // line width in chars
   int lnLen = 0;
   // while line fit button width or label chars ends
   while ((lnWidth < fitWidth) && (begin + lnLen < lbLen)) {
    lnLen++;
    lnText = label.substring(begin, begin + lnLen);
    lnWidth = getFont().getAdvance(lnText);
   }
   if (begin + lnLen < lbLen)
    lnLen--;
   begin += lnLen;
   lnText = lnText.substring(0, lnLen);
   lines.addElement(lnText);
  }
  return lines;
 }
}

Пример использования:

class Scr extends MainScreen {
 CustomButton button1;
 CustomButton button2;
 CustomButton button3;

 public Scr() {
  add(button1 = new CustomButton(20, 60,
    "first buttton it's with a large text"));
  add(button2 = new CustomButton(40, 120,
    "second buttton it's with a large text"));
  add(button3 = new CustomButton(60, 200,
    "third buttton it's with a large text"));
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...