Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.220.13.70] |
|
Сообщ.
#1
,
|
|
|
Заморочка при доступе к массиву n_w_char в методе DrawStr на телефоне...
------------------------------------------------------------------------------- import javax.microedition.lcdui.*; import javax.microedition.io.*; import javax.microedition.lcdui.game.Sprite; public class font { public Image im_font; // шрифт public int w_font; // ширина public int h_font; // высота public int[][] n_w_char; // параметры отображения public int n_char; // число символов в шрифте public int font_hight = 14; // высота символа public Display disp; public font( String font_name) { try { im_font = Image.createImage("/" + font_name); // загруз шрифта } catch( Exception eio){ info( "font load error"); }; w_font = im_font.getWidth(); h_font = im_font.getHeight(); font_hight = h_font - 1; int[] n = new int[w_font * h_font]; im_font.getRGB( n, 0, w_font, 0, 0, w_font, h_font); // в массив int adr = w_font * (h_font - 1); n_char = 0; for ( int i=0; i<w_font; i++) // число символов if ( n [adr+i] == -1) // ? метка конца символа n_char++; n_w_char = new int[n_char + 1][2]; // int k = adr - 1; int m; int ni = 0; int ni_adr = 1; n_w_char[0][1] = 0; for ( int i=0; i<w_font; i++) // запись параметров символов if ( n[adr+i] == -1) { m = adr+i; n_w_char[ni][0] = m - k; // запись ширины символа if ( ni_adr < n_char) n_w_char[ni_adr][1] = i + 1; // запись адреса начала отображения символа k = m; ni++; ni_adr++; } } public void DrawStr( Graphics g, String str, int x, int y) { int key; int x1 = x; int x0 = 0; int w0 = 0; int l = str.length(); for (int i=0; i<l; i++) { key = (int)str.charAt(i); if ( key >= 1000) key -= 880; else key -= 32; try { [B] x0 = n_w_char[key][1]; w0 = n_w_char[key][0];[/B] } catch (Exception ex) { // на телефоне Excception, на симуляторах нет info( "key "+ key); } g.drawRegion( im_font, x0, 0, w0, font_hight, Sprite.TRANS_NONE, x1, y, Graphics.TOP | Graphics.LEFT); x1 = x1 + w0; } } public void info(String s) { Alert al = new Alert( "Exception", s, null, null); disp.setCurrent(al); } } ------------------------------------------------------------------------------------------------- На симуляторах все работает в NetBeans тоже - чегой то я не понимаю n_w_char инициализируется в конструкторе DrawStr вызывается в методе paint Canvas-а может массив не видится Прикреплённый файлStd_Canvas.jar (8.83 Кбайт, скачиваний: 28) |
Сообщ.
#2
,
|
|
|
на телефоне постоянно выдает ArrayIndexOutOfBoundsException
Добавлено Похоже отрисовка начинается раньше отработки коструктора |
Сообщ.
#3
,
|
|
|
Цитата shomer @ Похоже отрисовка начинается раньше отработки коструктора Для данного класса это невозможно. Покажите первую строчку stacktrace'а, что ли. |
Сообщ.
#4
,
|
|
|
Судя по всему так и есть. (Телефонная оптимизированная реализация JVM ).
Решил проблему булевым флагом в конце конструктора "шрифт_загружен"=true; тогда и разрешаю отрисовку строк. Долго тупил однако --------------------------------------------------------------------------------- если кому нужно выложу исходник со шрифтом |
Сообщ.
#5
,
|
|
|
Исходник реализации класса для работы со своим шрифтом.
работает медленно - нужна подсказка. ----------------- import javax.microedition.lcdui.*; public class font { private int[] obr_f; // образ шрифта public int w_font; // ширина public int h_font; // высота protected int[] w_sym; // ширина символа в фонте protected int[] of_sym; // смещение символа в фонте public int n_sym; // число символов в шрифте public int font_height; // высота символа public boolean f_load = false; // загрузка шрифта закончена private int blanc; // пустой пиксел // контруктор загрузчик font, font_name - имя файла шрифта public font( String font_name) { Image im_font = null; try { im_font = Image.createImage("/" + font_name); // загруз шрифта w_font = im_font.getWidth(); h_font = im_font.getHeight();} catch( Exception eio){ }; font_height = h_font - 2; // реально высота шрифт меньше obr_f = new int[w_font * h_font]; im_font.getRGB( obr_f, 0, w_font, 0, 0, w_font, h_font);// в массив im_font = null; // кирдык image // определяем число символов в шрифте int adr = w_font * (h_font - 1); // начало меток blanc = obr_f[0]; // прозрачный пиксел n_sym = 0; for ( int i=0; i<w_font; i++) if ( obr_f [adr+i] != blanc) // ? метка конца символа n_sym++; w_sym = new int[n_sym + 1]; of_sym = new int[n_sym + 1]; int k = adr - 1; int m; int ni = 0; int ni_adr = 1; of_sym[0] = 0; // запись параметров каждого символа в массив параметров шрифта for ( int j=0; j<w_font; j++) if ( obr_f[adr+j] != blanc) { m = adr+j; w_sym[ni] = m - k; // запись ширины символа if ( ni_adr < n_sym) of_sym[ni_adr] = j + 1; // запись адреса начала отображения символа k = m; ni++; ni_adr++; } f_load = true; // шрифт загружен } // простая отрисовка строки public void DrawStr( Graphics g, String str, int x, int y) { if ( f_load) { int key; int l = str.length(); for (int i=0; i<l; i++) { key = (int)str.charAt(i); if ( key >= 1000) key -= 880; else key -= 32; g.drawRGB( obr_f, of_sym[key], w_font, x, y, w_sym[key], font_height, true); x += w_sym[key]; } } } // отрисовка строки цветом - f_acolor на фоне - b_acolor с учетом прозрачности, формат AARRGGBB public void DrawStr( Graphics g, String str, int x, int y, int f_acolor, int b_acolor ) { if ( f_load) { int key; int l = str.length(); int z = w_font * font_height; int[] color_f = new int[z]; java.lang.System.arraycopy( obr_f, 0, color_f, 0, z); for ( int i=0; i<z; i++) if ( color_f[i] != blanc) color_f[i] = f_acolor; else color_f[i] = b_acolor; for (int i=0; i<l; i++) { key = (int)str.charAt(i); if ( key >= 1000) key -= 880; else key -= 32; g.drawRGB( color_f, of_sym[key], w_font, x, y, w_sym[key], font_height, true); x += w_sym[key]; } } } } |