Пишем на Java

Темы о Java и ее разновидностях типа J2me
Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пн июл 07, 2008 5:47 am

Уф! Понял! Ура, блин! Там ещё сказано, что нужно все функции статичными объявлять! Понял теперь. Потому что МидлетПаскаль их иначе просто видеть не будет! Но вот ещё незадача... Там доступ ко всему смачно ограничен. Там при компиляции МидлетПаскаль создаёт класс FW.class и потом в либах нужно ко всему через него обращаться. Вот пример куска рабочей либы:

Код: Выделить всё

public static void vibrate(int duration) 
{ 
  FW.fw.display.vibrate(duration); 
} 

public static void flash_backlight(int duration) 
{ 
  FW.fw.display.flashBacklight(duration); 
}
Это пример из официального хэлпа. Типа как получить доступ к подсветке и вибратору. Ну я пробовал по аналогии обратиться к Graphics, так хрен! Компилятор выдаёт ошибку, типа нету графикса в FW.fw. А ещё вот строка из одной либы:

Display.getDisplay(FW.fw).setCurrent(T);

Это вообще что-то архинепонятное... То есть, максимум, на что у меня хватит мозгов - написать либу, которая будет математические операции над числами производить. Потому что я не могу понять, как там обращаться ко всему. И в рунете нет ничего по этому поводу, а английский я "знаю очень плохо", точнее сказать "очень хорошо не знаю" его =)

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Вт июл 08, 2008 4:34 am

Код: Выделить всё

import javax.microedition.lcdui.Graphics;

public class Lib_test {
// ***********************************
 public static void printtext(String s,int x,int y){
    M.G.setColor(50,200,255);
    M.G.drawString(s,x,y-1,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x,y+1,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x-1,y,M.G.LEFT|M.G.TOP);
    M.G.drawString(s,x+1,y,M.G.LEFT|M.G.TOP);
    M.G.setColor(0,0,200);
    M.G.drawString(s,x,y,M.G.LEFT|M.G.TOP);
 }
// ***********************************
}
О как! Работает! гы гы. На форуме МидлетПаскаля спросил через какой класс нужно обращаться к графическим функциям (то есть, как мне там сказали, правильно говорить методам класса, О КАК) =) Эта типа функция рисует синий текст с голубой обводкой =) Первый шаг к написанию мультистрочного класса сделан =)

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт июл 11, 2008 6:08 am

Блин, Джава вообще со строками работать умеет??? Я полночи инфу в гугле ищу, ещё смотрю книжки Пирумяна и Горнакова. Ничего не могу толком найти. Или я чего-то не понимаю. Как мне, например, получить субстроку от строки, начиная с определённого по счёту символа? Как узнать длину строки? Как поиндексно обращаться к строке? Ну например:

Код: Выделить всё

String s = "Привет";
String str1 = s[0]; // str = "П";
String str2 = s[3]; // str = "в";
К моему удивлению это не сработало. Я был практически уверен, что сработает... В php так можно... гг...
Через какой класс в джаве со строками работают? И как обращаться к методам для обработки строк?
Блин, ну вот тот же php: там сотня функций для работы со строками, даже больше скорее всего! Чего там только нет!

Аватара пользователя
blackstrip
Админ
Сообщения: 1010
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Сб июл 12, 2008 8:44 pm

Код: Выделить всё

String s = "Привет";
String str1 = s.substring(0,1); // str = "П";
String str2 = s.substring(3,4); // str = "в";
короч вот выписка из jdk-вского хелпа:

Код: Выделить всё

Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example: 


     String str = "abc";
 is equivalent to: 


     char data[] = {'a', 'b', 'c'};
     String str = new String(data);
 Here are some more examples of how strings can be used: 


     System.out.println("abc");
     String cde = "cde";
     System.out.println("abc" + cde);
     String c = "abc".substring(2,3);
     String d = cde.substring(1, 2);
А вот собстно описание функции вырезания подстроки:
(две разновидности - одна с n символа до конца вырезает, вторая с n до m символа. Первый символ - НУЛЕВОЙ! Разность между m и n - как раз равна длине вырезаемого отрезка. например substring(3,4) вырежет символ номер 3, собстно длина этой строки 4-3 = 1, т.е. один этот самый символ)

Код: Выделить всё

substring
public String substring(int beginIndex)Returns a new string that is a substring of this string. The substring begins with the character at the specified index and extends to the end of this string. 
Examples: 

 "unhappy".substring(2) returns "happy"
 "Harbison".substring(3) returns "bison"
 "emptiness".substring(9) returns "" (an empty string)
 
Parameters:
beginIndex - the beginning index, inclusive. 
Returns:
the specified substring. 
Throws: 
IndexOutOfBoundsException - if beginIndex is negative or larger than the length of this String object.

--------------------------------------------------------------------------------

substring
public String substring(int beginIndex,
                        int endIndex)Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex. 
Examples: 

 "hamburger".substring(4, 8) returns "urge"
 "smiles".substring(1, 5) returns "mile"
 
Parameters:
beginIndex - the beginning index, inclusive.
endIndex - the ending index, exclusive. 
Returns:
the specified substring. 
Throws: 
IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Вс июл 13, 2008 12:32 pm

Спасибо, но я уже сам до всего этого допёр. Времени зря не терял. гг...
Уже знаю для чего это:
s.indexOf()
s.length()
s.charAt()
s.substring()
и даже это: Integer.parseInt()
Уже типа функцию написал для стилизированного вывода текста. Типа простого парсера. Можно функции скормить специально оформленную строку и она всё выведет указанным цветом, шрифтом и т п. =)
Теперь нужно как-то переделать тот класс для многострочного вывода текста и будет у меня универсальная функция для вывода стилизированного многострочного текста на канвас =) Типа аналог html. Короче говоря, можно, например, писать специальные странички и потом их через прогу при помощи этой функции открывать. Получатся на вид странички типа оперы мини, только пока не думал о выравнивании (но это, наверно, не проблема будет сделать). Ах да, ещё размер шрифта у меня можно менять, а опера мини всё одинаковым шрифтом выводит =)
Но вот с проблемой столкнулся... Если в одной строке будут и символы маленького шрифта, и символы большого шрифта, то нужно как-то до вызова drawString рассчитывать высоту каждой строчки на канвасе... Это будет непросто... Пока я даже не знаю, как это сделать... Можно, конечно, без drawString сначала рассчитать всё, а потом эти же самые операции по новой производить, но уже с вызовом drawString... И так с каждой строчкой. Под строчкой я подразумеваю количество слов, которое умещается в одной строке на канвасе. В общем, видимо в опере мини размер шрифта сделали одинаковым, потому что ума у них не хватило сделать разный =) Все эти рассчёты, наверно, очень медленно будут работать, особенно на моём сименсе... Можно, конечно, сразу брать по умолчанию высоту строки самую большую, но тогда если текст выводить маленьким шрифтом, то между строками много пустого места будет... Вот ведь как... =(

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Вс июл 27, 2008 8:51 pm

Я вот экспериментирую с написанием либ для мидлет паскаля. Написал вот это:

Код: Выделить всё

import javax.microedition.lcdui.*; 

public class Lib_ramka{ 
// *********************************** 
 public static int x,y,w,h; 
 public static Image a1,a2,bg; 
 public static Graphics g=M.G; 
 public static Displayable d=FW.CD; 
// *********************************** 
 public static void init(){ 
   x=(d.getWidth()*6)/100; 
   w=d.getWidth()-x*2; 
   y=(d.getHeight()-(w*86)/100)/2; 
   if(y<x)y=x; 
   h=d.getHeight()-y*2; 
   int p[]=null; 
   p=new int[x*d.getHeight()]; 
   for(int i=0;i<p.length;i++) 
   p[i]=0xbb000000; 
   a1=Image.createRGBImage(p,x,d.getHeight(),true); 
   p=new int[w*y]; 
   for(int i=0;i<p.length;i++) 
   p[i]=0xbb000000; 
   a2=Image.createRGBImage(p,w,y,true); 
 } 
// *********************************** 
 public static void frame(){ 
   g.drawImage(a1,0,0,g.LEFT|g.TOP); 
   g.drawImage(a1,d.getWidth(),0,g.RIGHT|g.TOP); 
   g.drawImage(a2,x,0,g.LEFT|g.TOP); 
   g.drawImage(a2,x,d.getHeight(),g.LEFT|g.BOTTOM); 
 } 
// *********************************** 
}
Подразумевается, что это должно работать так: сначала вызываем метод init, потом вызываем метод frame, и после прорисовки должна появиться полупрозрачная чёрная рамка. На эмуляторе работает, ещё чувак один проверял на Нокии N72, говорит, что тоже работает. А на сименсе С75 рамка не появляется. О_о Просто не появляется и всё, мидлет дальше выполняется и всё. В чём может быть дело? Раньше уже экспериментировал с альфа-каналом - на сименсе он точно отображался... А в этот раз не хочет...

Аватара пользователя
blackstrip
Админ
Сообщения: 1010
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Ср июл 30, 2008 7:03 pm

никада бы не подумал что сименсы поддерживают полупрозрачность (альфа канал), судя по тому как на сименсах "зштриховывается туманом" задний фон - вместо полупрозрачности просто в шахматном порядке точки закрашиваются например белым. итого 50% белых точек, и издалека на экран смотришь - во типа полупрозрачная как будто белая пленка))) я правда мало пробовал на сименсе использовать альфа-канал, но в памяти у меня четко отложилось что все мои эксперименты не привели ни к чему. мне кажется у сименсов нет поддержки альфа канала. если у тя значение альфы не равно "100% непрозрачному", то сименс думает что эт значит полностью прозрачный =) вот и не рисует ничего. скорее всего причина в этом.

Аватара пользователя
blackstrip
Админ
Сообщения: 1010
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Ср июл 30, 2008 7:10 pm

Вот выписка из хелпа по яве. Выделил там строку специально:

createRGBImage
public static Image createRGBImage(int[] rgb,
int width,
int height,
boolean processAlpha)Creates an immutable image from a sequence of ARGB values, specified as 0xAARRGGBB. The ARGB data within the rgb array is arranged horizontally from left to right within each row, row by row from top to bottom. If processAlpha is true, the high-order byte specifies opacity; that is, 0x00RRGGBB specifies a fully transparent pixel and 0xFFRRGGBB specifies a fully opaque pixel. Intermediate alpha values specify semitransparency. If the implementation does not support alpha blending for image rendering operations, it must replace any semitransparent pixels with fully transparent pixels. (See Alpha Processing for further discussion.) If processAlpha is false, the alpha values are ignored and all pixels must be treated as fully opaque.

Что означает "если платформа не поддерживает полупрозрачности, то она заменит любые полупрозрачные пиксели полностью прозрачными"
что является еще одним доказательством того, что сименсы не поддерживали полупрозрачность никогда =)

Плюс еще тот факт что в скинах есть цветовые схемы, и в них тоже канал полупрозрачности предусмотрен. Но он никогда ни на каких сименсах не пахал. Даже на Benq-Siemens E71 например в тех местах оболочки где например сообщение всплывает, задний фон забеливается пленкой - тоже тупая штриховка шахматным порядком вместо полупрозрачных пленок.

Если б сименс мог отрисовывать полупрозрачность, то первым делом это было бы видно по самой оболочке прошивки. А раз даже там "шахматы", то чо уж о яве говорить)

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Ср июл 30, 2008 7:43 pm

Так. По порядку.
1) Я делал прогу, которая выводила картинку, а потом перекрывала её чёрной полупрозрачной плёнкой. Работало! На сименсе работало. Могу показать.
2) В скинах как раз работает полупрозрачность! Тоже могу показать самодельный скин.

Ща, всё соберу это, выложу =)

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Ср июл 30, 2008 9:05 pm

http://wapcode.ru/pelena.jar
Тестил на Сименсе С75 =)
Обязательно посмотри - удивишься =)
Можешь декомпилировать, там не обфусцировано, код понятный будет.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя