sinuke

Пользователи
  • Публикаций

    153
  • Зарегистрирован

  • Посещение

  • Победитель дней

    20

sinuke стал победителем дня 9 августа

sinuke имел наиболее популярный контент!

1 Подписчик

Информация о sinuke

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Включить
  1. Ну может сделать ленту с акциями и скидками... А также, при просмотре детализации по акции сделать что-то типа "Принять участие / Записаться и т.д."
  2. Edit положить на Layout. Настройки у Layout такие, чтобы он занимал весь экран поверх всех компонентов. В Layout.OnTap скрывать Layout
  3. Всем привет Как все знаете, с весны этого года Google требует для всех новых приложений поддержку новейших API (а осенью затребует и от уже опубликованных). В FMX-приложениях это делается изменением targetAPI в манифесте. Что я собственно и сделал. Но столкнулся с неприятной особенностью. А именно: невозможно отправить картинку с помощью ShareSheetAction. При попытке отправить вылетает вот такая ошибка: В интернете наткнулся на статью (ссылка), в которой говорится, что начиная с API 24 механизм отправки картинок через Intent поменялся. Там же приводится решение того, как это сделать по новым требованиям. И конечно же это решение на Java, в Delphi решения данного вопроса нет. Решил попробовать реализовать, но столкнулся с непреодолимыми для себя проблемами.... Там получается три действия: 1) Создать и задеплоить файл res/xml/provider_paths.xml со следующим содержимым: <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths> С этим проблем не возникло. Создал, задеплоил 2) Добавить в манифест провайдер: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> Вот тут возникли проблемы. После добавления данных строк в манифест проект перестал деплоиться - ругается на недоступный символ "$" 3) Поменять код получения Uri картинки... Uri photoURI = Uri.fromFile(createImageFile()); ...меняется на: Uri photoURI = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider", createImageFile()); Однако, в FMX.MediaLibrary.Android.pas код для получения Uri выглядит следующим образом: procedure TSharingManagerAndroid.AddImage(var AIntent: JIntent; const AImage: TBitmap); var ImageFile: JFile; ImageUri: Jnet_Uri; ArrayList: JArrayList; OutputDir: JFile; begin Assert(AIntent <> nil); Assert(AImage <> nil); OutputDir := TAndroidHelper.Context.getExternalCacheDir(); ImageFile := TJFile.JavaClass.createTempFile(StringToJString('attachment'), StringToJString('.png'), OutputDir); ImageUri := TJnet_Uri.JavaClass.fromFile(ImageFile); AImage.SaveToFile(JStringToString(ImageFile.getAbsolutePath)); if FDataType = TSharingDataType.Image then AIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((ImageUri as ILocalObject).GetObjectID)) else begin // If we use ACTION_SEND_MULTIPLE action of Intent, we should put image throught Parcelable Array List. // Because in this case other application read EXTRA_STREAM like a ArrayList<Uri> ArrayList := TJArrayList.Create; ArrayList.add(ImageUri); AIntent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, ArrayList); end; end; И тут также возникает сложность для меня, т.к. я не представляю как можно получить ImageUri новым способом. В общем, давайте разбираться, как можно решить данный вопрос...
  4. sinuke

    Просмотр картинок в ListView FMX

    Я бы сделал это кодом. Отключил бы стандартное выделение ЛВ. А кодом бы уже смотрел в какую область был клик/тап. В зависимости от этого рисовал бы ректагл вокруг нужного изображения Но код получился бы конечно немного громоздкий.
  5. sinuke

    Увеличение содержимого TImage

    Посмотрите вот этот пример - https://github.com/sinuke/Image-Zoom-Demo Там есть увеличение жестами. И мышью. И увеличение выбранной области
  6. 10.2 (Tokyo) или Berlin?
  7. опечатался. верно. ListBox тормозит
  8. Компонент ListView предназначен для вывода списков. При этом на Андройде он не тормозит, в отличие ListView. Но кроме списков его можно приспособить для вывода практически любой информации. Правда сложновато. MultiView - для бокового меню Label - текстовые метки SpeedButton - кнопки TrackBar - в настройках используется для изменения какого либо значения Tlayout - "прозрачный" компонент, удобный для группировки других компонентов и их выравнивания Ну а вам, как человеку, который не знает даже, что это за компоненты, наверное самым простым будет использование WebBrowser, в который будете загружать нужные страницы. Думаю это самый простой случай, хотя и не самый стабильный
  9. можно сделать как здесь - https://play.google.com/store/apps/details?id=com.sinukeapps.locksmithery основной компонент, на котором все сделано - ListView (списки, меню, вывод информации и тесты, а также "о приложении") остальное - TMultiView для бокового дровера, лейблы, пару кнопок, трекбар. Для выравнивания - TLayout
  10. В Токио для того, чтобы показалось окно с прогрессом FGX нужно ресурсоемкую (длительную) операцию выполнять в отдельном потоке. самое простое примерно можно описать так: TTask.Run( procedure () begin //Выполнение операции TThread.Synchronize(nil, procedure () begin ActionDialog.Hide; end) end);
  11. sinuke

    Баг в Tokio

    у меня тоже бывают артефакты с закругленным ректанглом
  12. с кириллицей в файле вообще нет никаких проблем под андройдом, если файл в юникоде... проверяйте кодировку
  13. Не знаю на сколько вам это подойдет, но у меня запись и чтение в стрим (это может быть хоть файл, хоть мемористрим) происходит так: procedure SaveToStream(const AStream: TStream); var buff: TBytes; myString: string; begin ... myString := 'some string'; buff := TEncoding.UTF8.GetBytes(myString); l := Length(buff); AStream.Write(l, SizeOf(l)); AStream.WriteBuffer(buff, l); ... end; Чтение: procedure LoadFromStream(const AStream: TStream); var l: Integer; buff: TBytes; myString: string; begin ... AStream.Read(l, SizeOf(l)); SetLength(buff, l); AStream.ReadBuffer(buff, l); myString := TEncoding.UTF8.GetString(buff); ... end;