PaintCAD Mobile - журнал разработки

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб июл 19, 2025 6:18 pm

Доработка кода под загрузку полноразмерных фото из файла вместо мини-картинок предпросмотра из памяти

1. Запрос фото с камеры с сохранением в файл

В андроиде запрос Environment.getExternalStorageState() дает возможность узнать подсоединено ли вообще место, где можно сохранять и загружать "медию", в т.ч. фото. Если оно возвращает Environment.MEDIA_MOUNTED - значит есть такое место, и можно туда и сохранять, и загружать файлы. Причем оно не означает присоединенную SD-карту. Даже в телефонах без карты памяти этот запрос возвращает MEDIA_MOUNTED - этот значит некое место есть чтобы сохранять/загружать медиафайлы.

Поэтому это даже хорошо что сначала написался код, пробрасывающий фотку в миниатюре через память. Теперь если MEDIA_MOUNTED - то будем просить камеру андроида сохранять полноразмерное фото в файл. А если не MEDIA_MOUNTED - то пробрасывать мини-фотку через память (чтоб даже такие андроиды без медиахранилища могли что-то попытаться сфотографировать).

Будем просить камеру сохранять файл с фото в папку Pictures, под именем редким каким-нибудь, чтоб не затереть другие файлы находящиеся там. Я выбрал "__phot__.jpg" - такие файлы у пользователя там вряд ли будут.

Перед этим проверим еще - можно ли вообще что-то сохранить в Pictures. Создадим файл (который потом перезапишется фоткой) и создадим путь (вдруг папки Pictures вообще нет).

Получился вот такой гибридный вызов камеры для фото в файл или в память (в помощь тем, кто будет делать съемку тоже в андроиде, хотя примеров в инете полно, даже этот - франкенштейн из них, конечно же):

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

byte[] camphoto = null;
Uri furi;
boolean filephot = true;

String storageState = Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)) {
	String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separatorChar + "Pictures/__phot__.jpg";

	File phot = new File(path);
	try {
            if(!phot.exists()) {
                phot.getParentFile().mkdirs();
                phot.createNewFile();
            }
        } catch (IOException e) {
		filephot=false;
	}

	if (filephot)
	{
		furi = Uri.fromFile(phot);
		camphoto=null;
		Intent takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
		takePicture.putExtra( MediaStore.EXTRA_OUTPUT, furi);
		startActivityForResult(takePicture, 0);
	}
} else {
	filephot=false;
}

if (!filephot)
{
	camphoto=null;
	Intent takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
	startActivityForResult(takePicture, 1);
}
В итоге переменная filephot останется в значении true если мы фоткаем полноразмерное фото в файл. И станет false если возникли проблемы и тогда будем, как в предыдущем посте, снимать мини-фото через память без задействования файлов.

Запрос съемки под номером 0 будет связан со съемкой в файл. А под номером 1 - со съемкой через память.

Чтоб запросить съемку через файл - после создания Intent-а под именем takePicture (как в предыдущем посте) добавил ему информацию о файле командой takePicture.putExtra( MediaStore.EXTRA_OUTPUT, furi), где furi = Uri.fromFile(phot) - т.е. URI из нашего пути+имени JPG файла.

2. После съемки: загружаем фото из файла или достаем его из памяти

Ответная часть - реакция на отснятую фотку - тоже разрослась. В обработке запроса 0 (фото через файл) после удачной загрузки JPG-файла по пути+имени из furi-переменной - удаляем его. В обработке запроса 1 (фото через память) ничего не поменялось с предыдущего поста:

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

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
   super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
   //file photo
      if((requestCode == 0) && (resultCode == RESULT_OK)){
		this.getContentResolver().notifyChange(furi, null);
		try
		{
			InputStream ims = this.getContentResolver().openInputStream(furi);
			Bitmap bmp = BitmapFactory.decodeStream(ims);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
	        	bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
	        	camphoto = baos.toByteArray();
		} catch (Exception e) {
	        	camphoto = null;
		}

		File fdel = new File(furi.getPath());
		try
		{
			if (fdel.exists()) fdel.delete();
        	} catch (Exception e) {}

   //memory photo
      } else if ((requestCode == 1) && (resultCode == RESULT_OK)){
		Bundle extras = imageReturnedIntent.getExtras();
		if(extras.containsKey("data")) {
			Bitmap bmp = (Bitmap) extras.get("data");
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
	        	bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
	        	camphoto = baos.toByteArray();
	    	};
      };
}


Теперь у нас есть массив байтов, которые являются JPG-файлом снятого фото.

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб июл 19, 2025 7:32 pm

Масштабирование фото перед его загрузкой на рисунок в паинткаде

Также был написан код для масштабирования фото - он стоит после получения фото в Bitmap-картинку в памяти, перед его помещением в массив байтов. В предыдущем посте он исключен чтоб не пугать интересующихся работой андроида с камерой.

Полноразмерное фото в JPG-файле на Xiaomi Redmi Turbo 3 (Poco F6) получается размером около 3000 х 4000 пикселей. Конечно надо его умять до подходящего размера чтоб оно влезло в паинткадовский выбранный пользователем максимальный размер рисунка.

Для этого используется окно выбора размера фото (еще не прошло ревизию окон с масштабированием интерфейса на большие экраны, поэтому значки и тексты пока расположены в страшных местах), оно имеет аж три варианта действий:

Изображение

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

Экран - это "сними фото размером с экран телефона". Ну тут все просто, масштабируем до размеров экрана, обрезаем вылезшее за края размера экрана. Причем если макс.размер рисунка при старте паинткада выбран меньше экрана - то эта команда сделает фото размером с экран, а потом положит его среднюю часть на маленький рисунок макс.размера.

Запрос - это "сними фото указанного размера в пикселях". Хоть 5000x10 пикселей. В яве все так просто не работало, "запрос" мог просто аварийно закрыть паинткад, т.к. камера там на многих телефонах не знала как снимать экзотические размеры типа 5000x10 пикселей. А в андроиде тут точно также, как с "экраном" - масштабируем до указанных размеров и обрезаем лишнее вылезшее за указанный размер.

В итоге всё под андроидом заработало и камера снимает во всех режимах, загружая полученную фотку в паинткад для сохранения в файл или дальнейшей дорисовки. Прямо как раньше в яве)

Проверка съемки на тестовых телефонах

Упорядочим тестовые телефоны по версии андроида. Т.к. тестов много и скриншотов еще больше - тексты со скриншотами про каждый телефон сгруппированы спойлерами.

1 - Android 2.3.3 - Samsung Galaxy Ace
ТестыПоказать
Режим "Авто" - попросим фото, вписанное в макс.размер изображения паинткада (320x480 на этом экране по умолчанию). И в паинткад загружается фото 320x240 (т.к. по горизонтали максимум 320 пикселей)

Изображение

Изображение

Изображение

Изображение

Режим "Запрос" - попросим фото, указав вручную 100x180 пикселей. Фото сжимается до 180 пикселей по высоте и в паинткаде подгружается его средняя часть шириной 100 пикселей

Изображение

Изображение

Режим "Экран" - запрос фото размером с экран, т.е. 320x480

Изображение

Изображение

Изображение

Изображение
2 - Android 4.2 - RugGear RG310
ТестыПоказать
Режим "Авто" - паинткад вписывает фото в макс.размер 240x320. Телефон, оказалось, делает фото таких же пропорций (1920x2560). Поэтому паинткаду приходит фото ровно 240x320 пикселей.

Изображение

Изображение

Изображение

Изображение

Режим "Запрос" - попросим, в этот раз, длинное и невысокое фото 200x80 пикселей. Паинткад масштабирует фото до 200 пикселей по ширине и забирает из нее середину высотой 80 пикселей.

Изображение

Изображение

Изображение

Режим "Экран" - просит фото размером с экран 240x320 пикселей. Получает ее такую же по размеру как в режиме "Авто" получилась.

Изображение

Изображение
3 - Android (Mocor) 4.4.4 - Joy's S15
ТестыПоказать
При отладке заметил, что размер рисунка в Главном окне - не показывается. Оказывается, что для экранов больше 175 пикселей по ширине - показывается. А для экранов меньших (у Joy's S15 экран 128х160, явно меньше 175) - скрывается, чтоб не наезжать на текст позиции курсора, расположенный чуть правее.

Но в андроиде шрифты автомасштабируются до любых размеров и уже не должны налезать. Добавлено условие показывать размер рисунка если (размер экрана больше 175 пикселей по ширине) ИЛИ (паинткад запущен под Андроидом и в настройках выключен Шрифт окон). И на этом микроэкране запоказывался размер рисунка. Чтобы было видно какого размера фото мы получаем.

И еще - на этом телефоне нет задней камеры, только передняя камера для видеочатов и съемок себя самого. При съемке она работает заодно как зеркало (обращена по горизонтали), в настройках камеры выключить зеркальный режим не видно где =) Поэтому съемка и предпросмотр показывает обращенную по горизонтали фото. А в паинткад уже приходит нормальная, не обращенная.

Режим "Авто" - фото вписывается в макс.размер рисунка 128х160.
Снимает телефон фоты в соотношении 3 к 4. И поэтому при макс.размере 128х160 приходит фото 120х160.

Изображение

Изображение

Изображение

Изображение

Режим "Запрос". Попросим квадратную 100х100 пикселей.

Изображение

Изображение

Изображение

Режим "Экран". Просим фото на все 128х160 пикселей экрана.

Изображение

Изображение

Изображение
4 - Android 9 - Soyes XS13
ТестыПоказать
Режим "Авто" - фото вписывается в макс.размер рисунка 240х396

Этот телефон снимает только горизонтально повернутые фото. Хоть на экране камеры слово "Картинка" вертикально, и он реагирует на поворот телефона - все равно дает только горизонтальные фото. Если снимаешь, держа телефон вертикально - то поворачивает все что снял набок на 90 градусов. Поэтому для тестов телефон располагался горизонтально. И скриншоты в режиме съемки ниже повернуты тоже горизонтально - это то, что было видно на телефоне когда держишь его горизонтально.

При макс.размере 240х396 приходит фото 240х135 - это соотношение сторон почти равно соотношению сторон экрана целиком (240 х 432). Видимо чтоб фоткать и делать обои на телефон =) При этом внизу есть полоска трех сенсорных клавиш типа "назад", "домой", "последние приложения" - поэтому она отъедает часть экрана, оставляя паинткаду по вертикали 396 пикселей из 432 экранных.

Изображение

Изображение

Изображение

Изображение

Режим "Запрос". Попросим маленькую квадратную 70х70 пикселей.

Изображение

Изображение

Изображение

Изображение

Режим "Экран". Просим фото на все 240х396 доступных для паинткада пикселей экрана.

Изображение

Изображение

Изображение

Изображение

Изображение
5 - Android 12 - Xiaomi Duoqin F22 Pro
ТестыПоказать
Режим "Авто" - фото вписывается в макс.размер рисунка 640х960. После съемки и масштабирования под макс.размер получается фото 640х853 - это опять отношение сторон 3:4, как в других телефонах.

Изображение

Изображение

Изображение

Изображение

Режим "Запрос". Запрашиваем полоску 640х100 пикселей.

Изображение

Изображение

Изображение

Изображение

Режим "Экран". Просим фото на полные экранные 640х960 пикселей.

Изображение

Изображение

Изображение

Изображение

Изображение
6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)
ТестыПоказать
Режим "Авто" - фото вписывается в макс.размер рисунка 1220х2269. После съемки и масштабирования под макс.размер получается фото 1220х1626 - это снова 3:4.

Изображение

Изображение

Изображение

Изображение

Изображение

Режим "Запрос". Запрашиваем узкую полоску 200х2200 пикселей.

Изображение

Изображение

Изображение

Режим "Экран". Запрос на паинткадовский размер экрана 1220х2269 пикселей.

Изображение

Изображение

Изображение
7 - Java 2 Microedition - Nokia N90
ТестыПоказать

Чтобы сказать что окно "Камера" работает на всех тестовых телефонах - надо проверить его и на яве.

Nokia N90 имеет поворотный модуль камеры, можно повернуть его на себя и делать селфи, можно отвернуть от себя и делать фото всего вокруг. Как в этой рекламной картинке:

Изображение

В "сидячем" положении телефон лежит на столе, камера смотрит вправо. Расположим там фигурку для съемки:

Изображение

Вызываем в главном окне рисования "Джой вправо" - "Фото". Промежуточные окошки, которые скрыты в паинткаде под андроидом - "нажмите 5 или джойстик чтобы снять кадр", "повернуть ли фото после съемки?" - тут показываются.

Итак, режим "Авто" - фото запрашивается любого подходящего размера, пусть телефон сам решит какого размера фото он готов снять. Ява решает отдать фото 160х120 пикселей.

Изображение

Изображение

Изображение

Изображение

Изображение

Изображение

Изображение

Режим "Запрос". Если запросить фото с соотношениями, отличающимися от 4:3, то фото здесь просто растягивается. Запросим точно 4:3 соотношение: максимальные для текущего макс.размера рисунка 352 пикселя по горизонтали и 352*3/4 = 264 пикселя по вертикали. И камера тоже снимает и загружает в паинткад полученную фотку, точно запрошенного размера. У нокии камера фокусируется куда-то на дальние объекты вместо фигурки, но главное что работает и затаскивает фото в паинткад.

Изображение

Изображение

Изображение

Изображение

Изображение

Режим "Экран" пробовать не будем. Как было сказано выше если запросить фото с соотношениями, отличными от 4:3, то оно просто растягивается из 4:3 до запрошенного размера, искажая изображение на фото.
Теперь "Камера" работает в паинткаде и в андроиде, и в яве.

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вт июл 22, 2025 2:02 pm

blackstrip писал(а): Сб июл 19, 2025 7:32 pm 4 - Android 9 - Soyes XS13

Этот телефон снимает только горизонтально повернутые фото. Хоть на экране камеры слово "Картинка" вертикально, и он реагирует на поворот телефона - все равно дает только горизонтальные фото. Если снимаешь, держа телефон вертикально - то поворачивает все что снял набок на 90 градусов.
blackstrip писал(а): Сб июл 19, 2025 7:32 pm 7 - Java 2 Microedition - Nokia N90

Промежуточные окошки, которые скрыты в паинткаде под андроидом - "нажмите 5 или джойстик чтобы снять кадр", "повернуть ли фото после съемки?" - тут показываются.
Хотелось для андроида полностью выключить при каждом фото вопрос "Повернуть фото?". Но все-таки есть телефоны, которые не крутят фото при повороте телефона, как этот Soyes XS13. А есть и такие, которые не поворачивают экран вообще при наклоне телефона (например, Joy's S15 с его несенсорным микроэкраном).

Поэтому добавим новую настройку в главном меню, включающую/отключающую этот запрос. По умолчанию пусть будет выключена. Тем, у кого камера сама не поворачивает фото при повороте телефона - можно включить эту настройку и выбирать при каждом фотографировании повернуть фото после съемки или нет.

Изображение

Выдает окно с вопросом. Можно нажатием на "Да" переключить с "Выключено" на "Включено" и наоборот (как и другие настройки).

Изображение

Добавлена еще помощь про эту настройку, вызываемая по кнопке "0":

Изображение

При съемке после окошка выбора режима масштабирования фотки "Авто", "Запрос" или "Экран" появится еще окошко с вопросом о повороте:

Изображение

Фото вращается уже после получения с камеры в самом паинткаде, поэтому слушается макс.размера рисунка. Если снимать фото, например, размером с экран 480х800 при выбранном на старте паинткада таком же макс. размере 480х800 - то фото после поворота станет 800х480, не влезет в макс.размер, обрубится по бокам слева и справа до оставшейся максимальной ширины 480 и превратится в 480х480. Поэтому если хочется вращать этой настройкой такое фото, превращая из 480х800 в 800х480 - то, логично, макс.размер на старте надо указать 800х800. В такой макс.размер влезут и 480х800 и 800х480 без всяких обрезаний. Это и раньше было. Просто выглядит странно - попросил 480х800, попросил повернуть, получил 480х480 =)

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вт июл 22, 2025 7:16 pm

Выбор размера шрифтов под андроидом

Если присмотреться к интерфейсу с включенной и с выключенной виртуальной клавиатурой:

Изображение Изображение

то можно заметить, что размер шрифта-то не меняется, хотя пользователю кнопочного телефона достается целый экран, а пользователю сенсорного телефона остается полэкрана всего.

Проблема в том, что на полэкрана остается очень мало строк по вертикали. Строк 6-7 от силы. Раньше было больше строк, но потом их количество уменьшилось после того, как у шрифтов были добавлены дополнительные пустые отступы сверху и снизу строк чтоб меню красиво рисовалось и шрифты и их тени не наезжали на границы соседних пунктов, как писалось ранее:
blackstrip писал(а): Пт июн 27, 2025 1:53 am Когда паинткад был портирован под Android - шрифты поплыли. Строчки текста в интерфейсе слишком плотно ложились друг к другу. Пришлось ввести виртуальные отступы сверху и снизу строк.

Но даже с отступами строчки лежали так, что тень от строк (лежащая справа внизу) залезала в меню, в Помощи и др.окнах на границы рамки выбранного пункта. Поэтому был введен дополнительный отступ внизу строк. Функция расчета высоты строк теперь врала что шрифт больше по высоте (на 25% от высоты), а функция отрисовки текста честно рисовала. Шрифты слезли чуть вверх и все стало ок.
На какую величину нужно уменьшить размеры шрифтов

В данный момент размер шрифта рассчитывается динамически для андроида. Берется минимальный размер MS среди "ширины экрана" и "высоты экрана", и потом трем явовским шрифтам под названием SMALL (маленький), MEDIUM (средний) и LARGE (большой) задаются размеры:
SIZE_SMALL = MS/15;
SIZE_MEDIUM = MS/12;
SIZE_LARGE = MS/9;

Этот размер потом передается в paint.setTextSize(size). А сам paint используется при отрисовке текста через canvas.drawText.

После отрезания половины экрана виртуальной клавиатурой - экран как бы становится по высоте в два раза меньше. Можно было бы использовать эту новую половинную высоту. Но тогда шрифты просто станут в 2 раза меньше, это слишком мелко. Нужно определить сколько строк минимум должно быть по высоте экрана для приличной отрисовки интерфейса, для этого - найти все проблемные окна паинткада при текущем размере шрифта и посчитать сколько бы строк там подошло для приличной отрисовки. Еще интересно посмотреть сколько же их было раньше, на обычных явовских телефонах.

Сколько строк было на мобильных

Siemens с экраном 101х80 (C60, M55 и т.д.), старый паинткад (на этих телефонах с MIDP1.0 он работал вплоть до версии 1.5), простые окна, поэтому много строк и не требовалось. Тут около 6 строк, плотно прижатых друг к другу.

Изображение

Siemens с экраном 130x130 (например, C65), около 10 строк:

Изображение

Siemens с экраном 132x176 (например, CX75), около 13 строк:

Изображение

Siemens с экраном 240x320 (например, E71), около 14 строк:

Изображение

Проблемные окна - те, в которых много элементов интерфейса по вертикали, и текущих 7 строк не хватает.

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Чт июл 24, 2025 5:14 pm

Многострочные тексты и инструмент "Текст"

При проверке на андроиде таким же методом "сколько получается строк", как в предыдущем посте, нашлась еще ошибка. Запустим Android 2.3.3 с экраном 320х480 (эмулятор) - вводим несколько строк в инструмент "Текст" паинткада:

Изображение

Смотрим как они расположатся на рисунке:

Изображение
blackstrip писал(а): Вт июл 22, 2025 7:16 pm В данный момент размер шрифта рассчитывается динамически для андроида. Берется минимальный размер MS среди "ширины экрана" и "высоты экрана", и потом трем явовским шрифтам под названием SMALL (маленький), MEDIUM (средний) и LARGE (большой) задаются размеры:
SIZE_SMALL = MS/15;
SIZE_MEDIUM = MS/12;
SIZE_LARGE = MS/9;

Этот размер потом передается в paint.setTextSize(size). А сам paint используется при отрисовке текста через canvas.drawText.
Оказывается, canvas.drawText, которым микроэмулятор рисует явовские drawString-строки, вообще не понимает многострочные тексты. Нужно это исправить.

Отрисовка с выравниванием по левому краю, центру или правому краю многострочного текста, например, в сименсе C65 с разрешением экрана 130х130 была интересная - строки многострочного текста, выравненные по левому краю единым блоком, рисовались справа от опорной точки, по центру или слева:

Изображение

На Benq-Siemens E71 такая же:

Изображение

На андроиде со сломанными переносами - еще страшнее:

Изображение

Переписал процедуры отрисовки текста. Теперь после исправления отрисовки текста, рисования и выравнивания каждой его строчки отдельно - все выравнивается привычней глазу. Плюс добавлено еще центрирование текста по вертикали (раньше были только явовские "по низу" и "по верху", из коробки вертикально по центру в j2me нельзя текст отцентрировать):

Изображение

И для PCF-шрифтов переписана отрисовка - они тоже теперь выравниваются построчно:

Изображение

И под явой теперь выравнивается текст построчно:

Изображение

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Пт июл 25, 2025 4:37 pm

Выбор размера шрифтов под андроидом - продолжение
blackstrip писал(а): Вт июл 22, 2025 7:16 pm Проблемные окна - те, в которых много элементов интерфейса по вертикали, и текущих 7 строк не хватает.
Окна сообщений - не меньше 7 строк нужно, кое-как хватает:

Изображение Изображение

Окно помощи/советов дня - хорошо бы хоть три строчки текста минимум (а не две, как остается сейчас) иметь в поле просмотра. Тогда с дополнительными элементами типа границ поля просмотра, и картинки иногда чуть большей, чем две строки справа от нее - нужно 8 строк минимум, а лучше 9 строк.

Изображение Изображение

И самое высокое окно - Тип курсора. Редактор курсора максимум 5х5 квадратов-пикселей - лучше бы по высоте был 2 строки или даже 3. Итого 9-10 строк по высоте хорошо бы иметь:

Изображение Изображение

Итак, надо размеры шрифта интерфейса сменить на поменьше. Или отступы между строками текста поменьше. Или еще что-нибудь.

Во-первых, выставим пропорции между мелким, средним и большим шрифтом как в каком-нибудь ява-телефоне. Вот шрифт с телефона Siemens с экраном 132x176 пикселей (CX75 и многих других):

Изображение

15/12 = 1.25
23/12 = 1.917

Вот во столько раз должны быть средний и большой шрифты, соответственно, больше самого мелкого.

Размер шрифта будет зависеть не от минимального из размеров экрана (ширина/высота), а от минимального размера активной области экрана (части экрана в которой рисуются окна). Тогда на сенсорных телефонах будет не меньше 9 строк в высоту активной области экрана и на кнопочных телефонах (где вирт.клавиатуру не включают нажатием на экран после запуска паинткада) тоже будет не меньше 9 строк на весь экран.

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

Окно сообщений - было, стало с вирт.клавиатурой, стало без вирт.клавиатуры

Изображение Изображение Изображение

Окно помощи - было, стало с вирт.клавиатурой, стало без вирт.клавиатуры

Изображение Изображение Изображение

Окно "Тип курсора" - было, стало с вирт.клавиатурой, стало без вирт.клавиатуры

Изображение Изображение Изображение

Теперь на половинном экране умещается по высоте порядка 9 строк вместо 7. И даже самые большие по количеству компонентов окна смогут отрисоваться без проблем.

Это были скриншоты из эмулятора. Проверим что стало с интерфейсом на всех тестовых телефонах (там все тоже должно чуть уменьшиться).

Проверка уменьшенных шрифтов интерфейса на тестовых телефонах

1 - Android 2.3.3 - Samsung Galaxy Ace

Изображение

Изображение

Изображение

2 - Android 4.2 - RugGear RG310

Изображение

Изображение

Изображение

3 - Android (Mocor) 4.4.4 - Joy's S15

Изображение

Изображение

Изображение

4 - Android 9 - Soyes XS13

Изображение

Изображение

Изображение

5 - Android 12 - Xiaomi Duoqin F22 Pro

Изображение

Изображение

Изображение

6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)

Изображение

Изображение

Изображение

7 - Java 2 Microedition - Nokia N90

Изображение

Изображение

Изображение

Теперь даже окна с большим количеством элементов влезают в экран на всех тестовых телефонах при различных сочетаниях ширина/высота экрана. На Нокии после переделки алгоритмов расчета отступов сверху и снизу строк текста - чуть уплыли шрифты (на софт-клавишах вниз, в заголовках окон вверх), но пока не критично, это будет поправлено позже.

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

Re: PaintCAD Mobile - журнал разработки

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

Следующее окно - CheckUpdate:

Изображение

Ревизия окна CheckUpdate

Окно вызывается из главного меню "0"-"Справка"-"Обновление". В этом окне один только текст. И оно не умеет ничего обновлять, только показывает версию установленного паинткада и версию паинткада на сайте. Увидел что на сайте есть версия новее твоей - качаешь сам новую версию) Вот оно в последней бета-версии:

Изображение

Тут нужно масштабировать отступы от краев и оно будет готово. Но можно еще расширить функционал.

Прокачка окна CheckUpdate

Можно, как в PaintCAD 4Windows, получать информацию с сайта не только о последней релизной стабильной версии, но и о нестабильной более новой бета-версии (если она есть). Отображать обе версии и позволять скачать сразу APK файлы под андроидом, а под явой - просто показывать какие версии есть на сайте.

После проделывания описанного получилось так:

1) когда и релизная версия, и бета-версия лежат на сайте - окно под андроидом показывает две ссылки на скачивание. Для скачивания можно кликнуть по ним пальцем, а можно нажать на левую софт-клавишу (Релиз) или джойстик (Бета).

Изображение

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

Изображение

3) когда нет интернета - окно показывает что нет ответа от сайта и всё:

Изображение

Проверка окна CheckUpdate на тестовых телефонах

1 - Android 2.3.3 - Samsung Galaxy Ace

Изображение

2 - Android 4.2 - RugGear RG310

Изображение

3 - Android (Mocor) 4.4.4 - Joy's S15

Изображение

4 - Android 9 - Soyes XS13

Изображение

5 - Android 12 - Xiaomi Duoqin F22 Pro

Изображение

6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)

Изображение

7 - Java 2 Microedition - Nokia N90

Интернет к ней не подключить, вайфая в ней нет, а мобильный интернет (даже если симку вставить) везде 4G только работает, остальное 2G/EDGE/3G только полагивает, тужится и ничего не грузит) Так что скриншот о том, как она не может подключиться к интернету.

Изображение

Теперь окно CheckUpdate (Обновление) показывает версии новейшего доступного релиза и новейшей доступной беты, а под андроидом может действительно обновлять паинткад до релиза или до бета-версии.

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вс авг 03, 2025 4:34 pm

Следующий модуль - Common:

Изображение

Ревизия модуля Common

Этот модуль содержит кучу разных общих методов, используемых всеми остальными окнами, рисование окошек и компонентов на них, рисование строк, соединение с интернетом (для проверки обновлений) и т.д.

Поэтому масштабирование окошка здесь не провести. Но можно разбраться с проблемами в этих методах в модуле.

Почему у Нокии N90 строчки рисуются так высоко
blackstrip писал(а): Пт июл 25, 2025 4:37 pm Теперь даже окна с большим количеством элементов влезают в экран на всех тестовых телефонах при различных сочетаниях ширина/высота экрана. На Нокии после переделки алгоритмов расчета отступов сверху и снизу строк текста - чуть уплыли шрифты (на софт-клавишах вниз, в заголовках окон вверх), но пока не критично, это будет поправлено позже.
Попробуем прямо поверх окна паинткада написать две строчки, окруженные прямоугольниками сверху и снизу, вот таким кодом:

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

g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_SMALL));
int fohe = g.getFont().getHeight();
g.setColor(255,255,0);
g.drawString("Top",0,150,Graphics.LEFT | Graphics.TOP);
g.drawString("Bottop",200,150,Graphics.LEFT | Graphics.BOTTOM);
g.setColor(255,0,255);
g.drawRect(0,150,200,fohe);
g.setColor(0,255,255);
g.drawRect(200,150-fohe,200,fohe);
Вместо "Bottom" напишем текст "Bottop" чтоб была в строчке буква "p", достающая до самого низа строки.

Рамки обрисовывают строки и видно какие отступы по умолчанию в нокии N90:

Изображение

Изображение

А вот этот же код в сименсе (из-за большого JAR и большого размера классов паинткад выдает там OutOfMemory при загрузке, поэтому встроим код в другую прогу - BarCoder):

Изображение

Видно что в сименсе строчки без особых отступов, а в Nokia N90 они имеют большой отступ снизу при верхней точке опоры Graphics.TOP, и большой доступ сверху при нижней точке опоры Graphics.Bottom.

Если бы этого отступа не было - строчки бы нормально центрировались в заголовке окна и других местах, где используется верхняя точка опоры Graphics.TOP. А так - придется смириться с тем, что на нокии такой отступ и должен быть, никакими костылями типа сдвига на n пикселей вниз его править не нужно. Тем более что при опоре Graphics.BOTTOM строчки примерно посередине этой области с отступом и на софтклавишах выглядят более-менее хорошо.

Для проверки - запуск на андроиде JAR-файла паинткада в j2me runner:

Изображение

Шрифт надписей Top и Bottop выравнен по вертикали относительно границ строки - поэтому все ровно рисуется и в заголовках окон. Так что это косяк чисто нокии N90. Оставляем его без исправлений и искусственных сдвигов по вертикали.

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вт авг 12, 2025 9:31 pm

Следующий модуль - CurType:

Изображение

Ревизия модуля CurType

Этот модуль - окошко, вызываемое по "0" - "Настройки" - "Тип курсора". В нем можно выбрать размер курсора 1x1, 3x3 или 5x5 пикселей и нарисовать его самому (красным квадратом), а также выбрать в нем "горячую точку" (синим квадратом) - точку, которая рисует пиксели. Или выбрать курсор из стандартных заготовленных курсоров.

В последней бета-версии выглядело так:

Изображение

Его уже помучали в предыдущих постах, так что оно готово. После расстановки строк с зазорами и рисования квадратов-курсоров толщиной 1 виртуальный пиксель стало таким:

Изображение

На квадратном экране поле рисования курсора маленькое, а на вытянутых по вертикали - увеличивается (т.к. строк влезает больше, а весь остальной интерфейс завязан на высоту строки).

Проверка окна CurType на тестовых телефонах

1 - Android 2.3.3 - Samsung Galaxy Ace

Изображение

2 - Android 4.2 - RugGear RG310

Изображение

3 - Android (Mocor) 4.4.4 - Joy's S15

Изображение

4 - Android 9 - Soyes XS13

Изображение

5 - Android 12 - Xiaomi Duoqin F22 Pro

Изображение

6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)

Изображение

7 - Java 2 Microedition - Nokia N90

Изображение

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

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб авг 16, 2025 10:26 am

Следующие модули - DTFont2, DTFont - служебные, почти одинаковые по составу, содержат процедуры загрузки PCF-шрифтов и рисования ими (один для функции "Шрифт окон" чтоб на окошках рисовать, второй для рисования шрифтами с помощью инструмента "Текст"). Их масштабировать не нужно.

Следующее окошко EditColor:

Изображение

Ревизия окна EditColor

Это окно вылезает когда в окне Палитры ставим рамку переднего цвета (ПЦ) или фонового (заднего) цвета (ЗЦ) и правим цвет в палитре по левой софт клавише в 8-битном режиме рисования. Оно же в 24-битном режиме вызывается в окне палитры по этой же левой софт-клавише, но не правит цвет в палитре, а переходит в режим выбора ПЦ/ЗЦ-цвета по R, G, B компонентам.

В последней beta-версии оно выглядело так:

Изображение

Сначала прописываем везде масштабирование и смотрим что получилось:

Изображение

Внизу образовался большой зазор, строчка с RGB-значениями в нижней части окна не центрирована относительно ячейки цвета слева от строчки. Сделаем вертикальные зазоры по 3 виртуальных пикселя, а строки разложим относительно новых положений полей:

Изображение

Кажется, что строка у нижнего поля смещена, проверим по границам - нет, строка ровно по высоте там же, где поле с цветом:

Изображение

Проверка окна EditColor на тестовых телефонах

1 - Android 2.3.3 - Samsung Galaxy Ace

Изображение

2 - Android 4.2 - RugGear RG310

Изображение

3 - Android (Mocor) 4.4.4 - Joy's S15

Изображение

4 - Android 9 - Soyes XS13

Изображение

5 - Android 12 - Xiaomi Duoqin F22 Pro

Изображение

6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)

Изображение

7 - Java 2 Microedition - Nokia N90

Изображение

На всех тестовых телефонах все ок.

Ответить

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

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