Jump to content

Александр Клопоцкий

Active subscription
  • Content Count

    44
  • Joined

  • Last visited

Community Reputation

17 Good

About Александр Клопоцкий

  • Birthday 02/17/1972

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Да, верно. Поставил у метки: HitTest = True, и метка стала реагировать на событие OnTap.
  2. В версии 1.4.1.1 перестал работать TfgDrawerLayout. Демо-пример: "DrawerDemo". На Drawer панеле, в текстовой метке fgLabel2 прописал событие OnTap: procedure TForm4.fgLabel2Tap(Sender: TObject); begin fgDrawerLayout1.Close(True); end; Нажимаю на текстовую метку, и нет реакции, не отрабатывает.
  3. Может кто еще использует модуль FGX.PanelAnimation.pas из "Проекты пользователей" - "Проверка контрольных знаков": https://github.com/sinuke/excises Делал миграцию по этому руководству, "T" убирал, но до конца с "Create" ошибки не могу исправить. Вот исходник, который разработал "sinuke", компилировался на 1.3.0.0 и ошибки при компиляции на 1.4.1.1 в связи с переходом на новый Android мост. Помогите пожалуйста исправить. unit FGX.PanelAnimation; interface uses System.SysUtils, FGX.Controls, FGX.Types, Android.Api.ActivityAndView, Java.Bridge; type TTranslateAnimationListener = class(TJavaLocal, JAnimation_AnimationListener) protected FFinishCallback: TfgCallback; public constructor Create(const AFinishCallback: TfgCallback); destructor Destroy; override; {JAnimation_AnimationListener} procedure onAnimationEnd(const AArg0: TJAnimation); procedure onAnimationRepeat(const AArg0: TJAnimation); procedure onAnimationStart(const AArg0: TJAnimation); end; TfgPanelAnimation = class public class procedure ShowPanel(const AControl: TfgControl; const AY: Single; const ADuration: Integer; const AFinishCallback: TfgCallback = nil); class procedure HidePanel(const AControl: TfgControl; const AY: Single; const ADuration: Integer; const AFinishCallback: TfgCallback = nil); end; implementation uses FGX.Animation, FGX.Helpers.Android, FGX.Controls.Android, FGX.Types.AutoreleasePool, Android.Api.Resources; { TMyAnimatorListener } constructor TTranslateAnimationListener.Create(const AFinishCallback: TfgCallback); begin inherited Create; FFinishCallback := AFinishCallback; end; destructor TTranslateAnimationListener.Destroy; begin FFinishCallback := nil; inherited; end; procedure TTranslateAnimationListener.onAnimationEnd(const AArg0: TJAnimation); begin if Assigned(FFinishCallback) then FFinishCallback; end; procedure TTranslateAnimationListener.onAnimationRepeat(const AArg0: TJAnimation); begin end; procedure TTranslateAnimationListener.onAnimationStart(const AArg0: TJAnimation); begin end; { TfgPanelAnimation } class procedure TfgPanelAnimation.HidePanel(const AControl: TfgControl; const AY: Single; const ADuration: Integer; const AFinishCallback: TfgCallback); var View: TJView; Listener: TTranslateAnimationListener; Animation: TJTranslateAnimation; Interpolator: TJPathInterpolator; Scale: Single; begin Scale := TfgAndroidHelper.ScreenScale; View := AControl.Handle.View; Animation := TJTranslateAnimation.Create(0, 0, 0, AY * Scale); if ADuration = PlatformDuration then Animation.setDuration(TJResources.getSystem.getInteger(TJR_integer.config_shortAnimTime)) else Animation.setDuration(ADuration); Animation.setFillBefore(True); Animation.setFillAfter(False); Interpolator := TJPathInterpolator.Create(0.64, 0, 0.78, 0); Listener := TTranslateAnimationListener.Create( procedure begin if Assigned(AFinishCallback) then AFinishCallback(); TfgAutoreleasePool.Release(Listener); TfgAutoreleasePool.Release(Interpolator); TfgAutoreleasePool.Release(Animation); end); TfgAutoreleasePool.Store(Listener); TfgAutoreleasePool.Store(Interpolator); TfgAutoreleasePool.Store(Animation); Animation.setInterpolator(Interpolator); Animation.setAnimationListener(Listener); View.startAnimation(Animation); end; class procedure TfgPanelAnimation.ShowPanel(const AControl: TfgControl; const AY: Single; const ADuration: Integer; const AFinishCallback: TfgCallback); var View: TJView; Listener: TTranslateAnimationListener; Animation: TJTranslateAnimation; Interpolator: TJPathInterpolator; Scale: Single; begin Scale := TfgAndroidHelper.ScreenScale; View := AControl.Handle.View; Animation := TJTranslateAnimation.Create(0, 0, 0, AY * Scale); if ADuration = PlatformDuration then Animation.setDuration(TJResources.getSystem.getInteger(TJR_integer.config_shortAnimTime)) else Animation.setDuration(ADuration); Animation.setFillEnabled(True); Interpolator := TJPathInterpolator.Create(0.22, 1, 0.36, 1); Listener := TTranslateAnimationListener.Create( procedure begin if Assigned(AFinishCallback) then AFinishCallback(); TfgAutoreleasePool.Release(Listener); TfgAutoreleasePool.Release(Interpolator); TfgAutoreleasePool.Release(Animation); end); TfgAutoreleasePool.Store(Listener); TfgAutoreleasePool.Store(Interpolator); TfgAutoreleasePool.Store(Animation); Animation.setInterpolator(Interpolator); Animation.setAnimationListener(Listener); View.startAnimation(Animation); end; end. [DCC Error] FGX.PanelAnimation.pas(12): E2291 Missing implementation of interface method JAnimation_AnimationListener.onAnimationEnd [DCC Error] FGX.PanelAnimation.pas(12): E2291 Missing implementation of interface method JAnimation_AnimationListener.onAnimationRepeat [DCC Error] FGX.PanelAnimation.pas(12): E2291 Missing implementation of interface method JAnimation_AnimationListener.onAnimationStart [DCC Error] FGX.PanelAnimation.pas(83): E2010 Incompatible types: 'TJView' and 'JView' [DCC Error] FGX.PanelAnimation.pas(84): E2010 Incompatible types: 'TJTranslateAnimation' and 'JTranslateAnimation' [DCC Error] FGX.PanelAnimation.pas(86): E2361 Cannot access private symbol TJAnimation.setDuration [DCC Error] FGX.PanelAnimation.pas(88): E2361 Cannot access private symbol TJAnimation.setDuration [DCC Error] FGX.PanelAnimation.pas(89): E2361 Cannot access private symbol TJAnimation.setFillBefore [DCC Error] FGX.PanelAnimation.pas(90): E2361 Cannot access private symbol TJAnimation.setFillAfter [DCC Error] FGX.PanelAnimation.pas(92): E2010 Incompatible types: 'TJPathInterpolator' and 'JPathInterpolator' [DCC Error] FGX.PanelAnimation.pas(109): E2361 Cannot access private symbol TJAnimation.setInterpolator [DCC Error] FGX.PanelAnimation.pas(110): E2361 Cannot access private symbol TJAnimation.setAnimationListener [DCC Error] FGX.PanelAnimation.pas(112): E2361 Cannot access private symbol TJView.startAnimation [DCC Error] FGX.PanelAnimation.pas(125): E2010 Incompatible types: 'TJView' and 'JView' [DCC Error] FGX.PanelAnimation.pas(126): E2010 Incompatible types: 'TJTranslateAnimation' and 'JTranslateAnimation' [DCC Error] FGX.PanelAnimation.pas(128): E2361 Cannot access private symbol TJAnimation.setDuration [DCC Error] FGX.PanelAnimation.pas(130): E2361 Cannot access private symbol TJAnimation.setDuration [DCC Error] FGX.PanelAnimation.pas(131): E2361 Cannot access private symbol TJAnimation.setFillEnabled [DCC Error] FGX.PanelAnimation.pas(133): E2010 Incompatible types: 'TJPathInterpolator' and 'JPathInterpolator' [DCC Error] FGX.PanelAnimation.pas(150): E2361 Cannot access private symbol TJAnimation.setInterpolator [DCC Error] FGX.PanelAnimation.pas(151): E2361 Cannot access private symbol TJAnimation.setAnimationListener [DCC Error] FGX.PanelAnimation.pas(153): E2361 Cannot access private symbol TJView.startAnimation [DCC Fatal Error] F2063 Could not compile used unit 'FGX.PanelAnimation.pas' FGX.PanelAnimation.pas
  4. Первая версия каталога, которая работала пару месяцев, у меня была сделана по "демо проекту": "Ресурсы" -> "Изображения" -> "Асинхронная загрузка изображения по URI". На хостинг я выкладывал новые *.jpg страниц каталога, и они открывались в приложении без обновления приложения. Это тот способ обновления, который использует официальное приложение от компании "Фаберлик". Приложение по размеру маленькое, все тащит через интернет. Навигация по страницам каталога: "<< Первая", "< Предыдущая", "Следующая >", "Последняя >>" и "Введите номер", какую страницу показать. Про клиентов приложения - это девушки, которые выбирают товар, рекламируют, продают его везде и всегда, "сетевики", ну и новые клиенты, которые готовы листать этот каталог вдоль и поперек часами, выискивая выгодные цены. Они часто листают каталог, где нет хорошего интернета, за городом, на даче, на шашлыках, и туалете, в автобусе, и им надо быстро сразу весь каталог полистать взад - вперед и увеличить где нужно. Я предложил им второй вариант, где каталог жестко зашит в "Assets Manager". Размер приложения сразу увеличился с 15 Mb до 65 Mb, но зато теперь каталог всегда с ними и они его могут всегда "кручу - верчу - смотрю как хочу", он у них летает. Для обновления в начале каталога нажимают ссылку на "Google Play" и обновляются без проблем. Знают число, когда каталог меняется и я рассылаю по "демо проекту": "Push-уведомления" -> "Получение Push-уведомления" - "Новый каталог, обновите приложение!". Им этот вариант однозначно больше нравиться. Они ведь всегда по причине нестабильного интернета скачивали себе в "Галерею" каталог в виде фото, это 300 *.jpg рисунков разрешения 902 x 1352. Каталог менялся, "Галерея" засорялась, они уже путались, это в "Галерее" новый каталог или старый, чистить не все умели, памяти со временем не хватало. А при обновлении приложения старый каталог гарантированно уйдет из памяти телефона и заменится новым, и не надо "Галерею" чистить потому как каталог в приложении. Ну и насчет памяти, в смысле стремления сделать приложение как можно меньшего размера. Это как с ассемблером, где каждый байт экономили, по тому как раньше объемы памяти были очень ограниченные. Сейчас памяти становиться много, экономить уже не нужно, ограничение это уже снимается, важным становиться удобство использования. Эта ошибка "нехватка памяти" при листании, которую я привел выше возникала на "дохлом" телефоне "Xiaomi Redmi Note 3" без включенной "выгрузки из памяти". В хороших последних телефонах она не возникает даже при выключенной "выгрузки из памяти", хватает памяти загрузить весь "Assets Manager" и листать его. Здесь выбор: Приложение либо универсальное, маленькое но медленное, которое обновлять не надо – Либо не универсальное, большое но быстрое, которое обновлять надо. Мои пользователи однозначно выбрали второе.
  5. Спасибо "sinuke" https://forum.fgx-native.com/profile/7-sinuke/ за публикацию проекта "Проверка контрольных знаков" и исходного кода в общий доступ: https://github.com/sinuke/excises Там я смотрел, как правильно добавлять, вызывать и закрывать дополнительные формы в свой проект. Эту тему можно вынести и на вебинары по обзору возможностей библиотеки. Добавил вызов формы просмотра выбранной страницы каталога: procedure TfmCatalog.ShowCatalogPage; begin fmCatalogPage := TfmCatalogPage.Create(Self); fmCatalogPage.IsAnimating := True; TfgAnimationHelper.ShowForm(fmCatalogPage, [TfgAnimationOption.StartFromCurrent], ANIMATION_DIRATION, procedure begin fmCatalogPage.IsAnimating := False; end); end; По "демо проекту": "Компоненты" -> "TfgCollectionView" -> "Выделение" сделал вызов формы просмотра выделенной страницы каталога: procedure TfmCatalog.cvCatSelectionChanged(Sender: TObject; const ASelectedItems: TArray<System.Integer>); var ItemIndex: Integer; begin for ItemIndex in ASelectedItems do begin CatalogPage := ItemIndex + 1; ShowCatalogPage; end; end; По "демо проекту": "Жесты" -> "Жест "Zoom" - увеличение масштаба" без изменения кода примера добавил функционал просмотра страницы каталога с Zoom: procedure TfmCatalogPage.imCatPageZoom(Sender: TObject; const AZoomInfo: TfgZoomInfo); begin if AZoomInfo.Phase = TfgGesturePhase.&InProgress then begin imCatPage.PositionMode := TfgImage.DefaultPositionMode; imCatPage.Size.SetSizeF(AZoomInfo.InitialSize.cx * AzoomInfo.Scale, AZoomInfo.InitialSize.cy * AzoomInfo.Scale); imCatPage.Position.Point := imCatPage.LocalToForm(AZoomInfo.Focus) - AZoomInfo.InitialFocus * AzoomInfo.Scale; imCatPage.Realign; end; end;
  6. По "демо проекту": "Ресурсы" -> "Изображения" -> "Выгрузка изображений из памяти" сделал каталог. В "Assets Manager" загрузил изображения 292 страниц каталога. Без включения выгрузки из памяти, при прокрутке на 26 странице возникает ошибка нехватки памяти. После включения выгрузки из памяти прокручиваются все 292 страницы. Спасибо, прекрасно работает! TfgAssetsManager.Current.AutoreleaseOptions.Enabled := True;
  7. У меня подписка до 05.04.2020. Буду ждать счет.
  8. В библиотеке есть пример: "DrawerDemo". Там на fgNavigationBar1 иконка "Гамбургера", при нажатии на которую выдвигается "Drawer". В "FGX Assets manager" видно как иконка подключается: Иконку для своего приложения можно взять из папки примера: Меню (TfgListMenu или TfgCollectionView) размещаем на "Drawer".
×
×
  • Create New...