Следующее окошко Explorer:
Ревизия окна Explorer
Когда-то давно для загрузки или сохранения файла надо было вводить путь и имя файла в текстовое поле. Например, для сименсов, "c:\Pictures\a.bmp". Потом в опциях окна с текстовым полем был сделан вызов файлового менеджера командой "Обзор...". Окно Explorer - файловый менеджер, позволяет выбрать один из файлов для сохранения или загрузки, или просто выбрать папку для сохранения/загрузки, а имя файла уже потом дописать вручную в текстовом поле. Также можно в нем создавать папки, удалять и переименовывать папки и файлы, предпросматривать файлы (картинки/шрифты) по клавише "1" перед загрузкой. В этом окне на виртуальной клавиатуре под андроидом появляется дополнительная кнопка "..." чтобы вызвать меню и управлять окошком (т.к. не во всех андроид-телефонах есть физическая кнопка "меню").
В последней beta-версии оно было таким (режим списка файлов и режим предпросмотра одного из файлов по кнопке "1"):
Сначала просто добавляем масштабирование окошка, шрифтов, списка файлов, строчки сдвигаем на необходимое количество виртуальных пикселей, линии вокруг рисунка в предпросмотре делаем толщиной с виртуальный пиксель, ну и смотрим что будет. Значки тут теперь расширяются в соответствии с размерами экрана (в два раза, если еще маленькие - снова в два раза, если опять маленькие - снова в два раза и т.д., до размера сравнимого со шрифтом списка файлов):
Проблема 1 - Тень выбранного пункта вылезает на окантовку выбранного пункта
Сейчас вывод текста и картинок всего меню обрезается вот так - обведем его красным прямоугольником, а снаружи закрасим полупрозрачным красным:
Регион вывода большой, если будем дополнительно в нем рисовать - то ничего не помешает, можно его не трогать.
Для выделенного пункта отдельно выводится градиент на фоне пункта плюс рамка. Потом "тень" текста и она тоже обрезается для всего меню как на скрине выше.
Будем рисовать рамку не в начале отрисовки, а уже после вывода тени. И тогда тень не будет на рамку вылезать. Получилось вот это для меню со значками и меню без значков (например, в системе помощи, непрошедшего ревизию окошка, но список для вывода помощи в нем используется как раз беззначковый):
Проверим теперь как это выглядит на Nokia N90 с ее странными шрифтами, задранными вверх:
Беззначковый список:
Список со значками:
Рисуется вполне нормально, хоть шрифты и задраны вверх - тени-то всегда ниже, поэтому они даже не пытаются вылезать на рамку выделенного пункта. Список дисков видно. Но внутрь любого диска залезаем, разрешаем паинткаду по запросу нокии доступ к файлам - показывает окно вообще без списка. Видимо, фатальная ошибка. Пытался давно разобраться. Не помню к какому выводу пришел. Может какие лишние слэши в пути. Сименс плевал на кривые пути, пытался привести к нормальным. А Нокия, может, ответственно пытается по ним залезть и спотыкается. Это было давно известно, на нокиях доступ к списку файлов по JSR 75 не на всех точно работал. Пришло время посмотреть почему оно так происходит. И, может, даже починить.
Проблема 2 - Доступ к файлам на Nokia N90 через JSR 75
Отладка показала что в момент запроса списка файлов у FileConnection из текущей папки вылетает исключение с длинным текстом. Выкидывание его в окно ввода имени файла дало прочитать текст исключения целиком:
Как раз до этого, когда смотрел в дипсике как правильно получать список файлов в папке на нокиях, он предупреждал что надо в манифест бы добавить разрешения:
Код: Выделить всё
MIDlet-1: FileList, , FileListMIDlet
MIDlet-Version: 1.0
MIDlet-Vendor: Your Company
MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.0
MIDlet-Permissions: javax.microedition.io.Connector.file.read,
javax.microedition.io.Connector.file.write
Хотя вот Nokia 7900 Prism, вроде бы, и так по файлам лазила (если правильно помню). Достаточно было нажать в окошке Explorer при доступе к файлам "Разрешить" и всё. Ну ладно, добавим эти разрешения в манифест.
После добавления разрешений (отдельного на запись, или обоих - на чтение и на запись) ничего не изменилось - то же исключение. Удаление приложения и повторная переустановка - ничего не поменялось, исключение такое же. И именно на write.
Оказалось, все проще. Убираем вообще из манифеста добавленные MIDlet-Permissions (наверное, они работают только если мидлет подписан сертификатом, но это не наш случай). Надо было просто в настройках приложения разрешить запрос на запись данных.
Вот этот пункт "Изменение данных" стоит на "Запрещен". Непонятно почему при запросе списка файлов нужно не только чтение, но и запись) Но вот поэтому ява и не дает паинткаду получить этот список, а выкидывает вместо этого исключение про write.
В Нокиях для несертифицированных приложений нет варианта "Разрешать на всю сессию" как в Сименсах. Но есть "Запрос всегда". Выбираем его.
Кстати,
этот пункт ВСЕГДА СБРАСЫВАЕТСЯ в состояние "Запрещен" при переустановке приложения (установке новой версии поверх старой).
И после этого в самом паинткаде при вызове "Обзора" вылезают по очереди два запроса (а не один, как было раньше в нокии). Первый на чтение:
Второй на запись:
И список файлов и папок появляется в окошке. И на телефоне "C:", и на карте памяти "E:" :
Попробуем сохранить картинку в файл и посмотреть лежит ли она на диске:
Да, она сохраняется.
Чтоб не было больше окошка Explorer с отсутствующим списком файлов - добавлена обработка исключения с выдачей, в этом случае, пустого списка файлов.
Проблема 3 - Бесконечные запросы на чтение и запись файлов при предпросмотре по кнопкам "1", "3" или "7"
Проверил предпросмотр в окошке Explorer по кнопке "1". Оказалось, что запрос на чтение/запись на нокии после своего пропадания с экрана инициирует перерисовку экрана. А в режиме предпросмотра по "1" файл считывается и показывается на экран при каждой перерисовке (обычно там идут перерисовки, например, при выборе следующего файла, и не ожидалось что кто-то еще будет вызывать перерисовку кроме самого паинткада) - поэтому на нокии идут бесконечные запросы на чтение и запись, просмотреть ничего невозможно, и прекратить эти бесконечные запросы нельзя.
Поправим это. Сделаем флажок, который означает что перерисовку экрана вызвал сам паинткад. И при всех режимах предпросмотра (а тут их аж 3 штуки - по кнопке "1" предпросмотр выбранного файла, по кнопке "3" предпросмотр GIF-кадров будущей анимации от 1.gif и далее, по кнопке "7" предпросмотр BMP-символов будущего PCF-шрифта от 32.bmp и далее, хотя можно и в обратку крутить 31.bmp, 30.bmp, если делаем символьный шрифт, а не текстовый) будем загружать файл и показывать только если паинткад вызвал перерисовку.
Сделаем тестовый набор файлов:
1) пара файлов t.bmp, t2.bmp для простого предпросмотра по "1";
2) пара файлов 1.gif, 2.gif для предпросмотра кадров анимации по "3";
3) пара файлов 32.bmp, 33.bmp для предпросмотра BMP-изображений символов по "7".
Часть файлов (кадры анимации и изображения символов) сделаем большими, с экран. Чтоб убедиться что окошко "разрешить чтение?", "разрешить запись?" после пропадания не оставляет после себя пустое место на экране (мало ли).
В итоге - все работает.
Показывается на Нокии N90 без бесконечных запросов чтения/записи предпросмотр и картинок по "1":
и для PCF-шрифтов по этой же "1":
и кадров анимации по "3":
и символов шрифта по "7" (т.е. BMP-картинок с именами 1.bmp - 255.bmp):
Теперь проверим это же на андроиде (а то вдруг на нокии починилось, а на андроиде сломалось).
Нет, здесь тоже все работает. Предпросмотр картинок по "1":
и PCF-шрифтов по "1":
и кадров анимации по "3":
и символов шрифта по "7" (т.е. BMP-картинок с именами 1.bmp - 255.bmp):
Проблема 4 - Предпросмотр по клавишам "1", "3", "7" дает слишком мелкие картинки на больших экранах
Предпросмотр мелкой картинки по "1" на FullHD экране дает мелкое изображение, ничего не видно вообще. Аналогичная проблема если рисуешь растровый шрифт с небольшими буквами:
Масштабировать саму картинку будем кратно - увеличивать в 2 раза по ширине и высоте размеры если она маленькая или, наоборот, уменьшать в 2 раза по ширине и высоте размеры если она большая. Повторять это до тех, пока рассчитанный размер не достигнет размеров экрана, а потом масштабировать до этого размера и выводить на экран.
Т.к. кнопки "1", "3", "7" заняты предпросмотром файлов, GIF-кадров и символов шрифта, то
назначим эту функцию на кнопку "9". Один раз жмем "9" - масштабирование включается, еще раз жмем "9" - масштабирование отключается.
Справа от имени файла выведем дополнительный значок "стрелки во все стороны" - это значит режим масштабирования включен и все предпросматриваемые картинки кратно растягиваются/ужимаются до размеров экрана.
Получаем:
Информация (имя файла, значок, номер символа шрифта, изображение символа шрифта) иногда мешает увидеть масштабированное изображение полностью. Поэтому
на кнопку "звездочка" назначим отключение/включение вывода информации.
При отключенной информации получаем:
Теперь проверим по "3" просмотр кадров GIF-анимации:
Без масштабирования:
С масштабированием по "9":
С масштабированием по "9" и отключенной информацией по "*":
Теперь проверим по "7" просмотр BMP-символов мелкого шрифта:
Без масштабирования:
С масштабированием по "9":
С масштабированием по "9" и отключенной информацией по "*":
И последнее - проверим по "1" просмотр PCF-шрифта. Паинткад подгружает выбранный шрифт и пишем им тестовый образец - английские и русские большие и маленькие буквы и цифры:
Без масштабирования:
С масштабированием по "9":
С масштабированием по "9" и отключенной информацией по "*":
Все режимы работают. Теперь предпросматриваемые картинки в окне Explorer могут быть отмасштабированы до размеров экрана по кнопке "9" и также можно скрыть информацию о файле по кнопке "звездочка"
Проверка окна Explorer на тестовых телефонах
Проверим:
1) режим списка файлов;
2) режим предпросмотра картинки по "1" с масштабированием по "9";
3) режим предпросмотра шрифта по "1" с масштабированием по "9".
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
На всех тестовых телефонах окошко Explorer нормально отображает список файлов и масштабированный предпросмотр рисунка и шрифта.