Перейти к содержанию
Fire Monkey от А до Я

AngryOwl

Пользователи
  • Постов

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

  • Посещение

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

    45

Весь контент AngryOwl

  1. Странно, конечно, почему градиент не везде работает. Но лично меня это не напрягает, потому-что битмап работает намного быстрее
  2. Не за что Тоже хотелось бы видеть что-то подобное в стандартных... Часто требуются подобное
  3. var VScrollBar: TScrollBar; aWidth : Single; VScrollBar := TListBox(Sender) {или ваш объект}.VScrollBar; if Assigned(VScrollBar) and VScrollBar.Visible then aWidth := VScrollBar.Width; думаю, так
  4. Использую в своем проекте библиотеку под OpenGL... Вариантов, думаю, у Вас нет. ИМХО: Придется переписывать...
  5. Все "быстренько" бывает только если приложение простое "как две копейки"... В реальности - это действительно напрягает. Извернуться можно примерно так: - создайте форму (например fmSplash) и на ее событие OnFormCreate делаете все что вам нужно - создайте TfgProgressDialog (например), который будет отображать процесс загрузки приложения и инициализацию переменных, модулей и т.п. - подготовьте все что вам нужно для вашего приложения, до создания главной формы (и других) - все что требует отображения в TfgProgressDialog помещайте в блоки TThread.Synchronize(TThread.CurrentThread, procedure begin {....} end); - все что не требует отображения в GUI и никак не связано с компонентами других форм, и что может выполняться "постольку-поскольку" помещайте в блоки TThread.CreateAnonymousThread(procedure begin {...} end).Start; - и когда, на ваш взгляд, уже пора создать главную форму приложения - обновите информацию в TfgProgressDialog и в блоке TThread.Synchronize(TThread.CurrentThread, procedure begin {....} end); создайте все формы вашего приложения... З.Ы. как пример можете посмотреть тут. просто иначе объяснить не вижу возможности...
  6. Особо править нет времени, разберетесь. Все просто - это компонент, унаследованный от стандартного TImage, с теми свойствами, которые Вам нужны. unit Sphere.ImageEx; interface uses System.Classes, System.Types, FMX.Types, FMX.Objects, FMX.Graphics; type TBitmapFit = (bfDefault, bfWidth, bfHeight, bfBoth); TImageEx = class(TImage) private FBitmapDisplayRect: TRectF; procedure SetBitmapFit(const Value: TBitmapFit); protected FBitmapFit: TBitmapFit; procedure Paint; override; public constructor Create(AOwner: TComponent); override; function ImagePointToBitmap(const APoint: TPointF): TPointF; property BitmapDisplayRect: TRectF read FBitmapDisplayRect; published property BitmapFit: TBitmapFit read FBitmapFit write SetBitmapFit; end; implementation { TImageEx } constructor TImageEx.Create(AOwner: TComponent); begin inherited; FBitmapFit := bfDefault; FBitmapDisplayRect := TRectF.Empty; end; function TImageEx.ImagePointToBitmap(const APoint: TPointF): TPointF; begin Result := APoint; if not (BitmapDisplayRect.IsEmpty) and Assigned(Bitmap) then begin Result.X := Result.X - Trunc(BitmapDisplayRect.Left); if Bitmap.Width > BitmapDisplayRect.Width then Result.X := Result.X / (BitmapDisplayRect.Width / Bitmap.Width ); Result.Y := Result.Y - Trunc(BitmapDisplayRect.Top); if Bitmap.Height > BitmapDisplayRect.Height then Result.Y := Result.Y / (BitmapDisplayRect.Height / Bitmap.Height ); end; end; procedure TImageEx.Paint; begin {весь код - в прикрепленном файлике} // всегда центрируем для этих методов отрисовки else if FBitmapFit <> bfDefault then begin // растягиваем по ширине с обрезкой верхнего/нижнего краев Canvas.BeginScene(); try Coef := B.Width / B.Height; R := RectF(0, 0, B.Width, B.Height); if FBitmapFit = bfWidth then R := RectF(0, 0, Width, Width / Coef) else if FBitmapFit = bfHeight then R := RectF(0, 0, Height * Coef, Height) else if FBitmapFit = bfBoth then begin if Coef >= 1 then R := RectF(0, 0, Height * Coef, Height) else R := RectF(0, 0, Width, Width / Coef); end; RectCenter(R, LocalRect); Canvas.DrawBitmap(B, RectF(0, 0, B.Width, B.Height), R, AbsoluteOpacity, DisableInterpolation); FBitmapDisplayRect := R; finally Canvas.EndScene(); end; end; end; procedure TImageEx.SetBitmapFit(const Value: TBitmapFit); begin if FBitmapFit <> Value then begin FBitmapFit := Value; Paint(); end; end; //initialization // RegisterFMXClasses([TImageEx]); end. Sphere.ImageEx.zip
  7. С аппаратной начинкой. Я уже писал тут о подобной проблеме. Либо не используйте градиент, либо используйте не TCircle, а PNG-изображения закрашенных окружностей. Второе - предпочтительнее. Потому-что: во-первых они будут работать намного быстрее, во-вторых - эффект "сглаживания" окружности будет намного приятнее выглядеть, и третье - можно использовать любую картинку, хоть с градиентом, хоть "цветочками"...
  8. Замените у себя модуль FMX.Media.Android.pas (файлик прилагаю) смотрите в нем новые свойства и процедуры property VideoWidth: Integer read FVideoWidth write FVideoWidth; property VideoHeight: Integer read FVideoHeight write FVideoHeight; property VideoBitCount: Integer read FVideoBitCount write FVideoBitCount; property VideoFPS: Integer read FVideoFPS write FVideoFPS; // auto constructor TAndroidVideoCaptureDevice.Create(const AManager: TCaptureDeviceManager; const ADefault: Boolean); procedure TAndroidVideoCaptureDevice.SetQuality(const Value: TVideoCaptureQuality); procedure TAndroidVideoCaptureDevice.DoStartCapture; допустим на форме fmMain есть компонент камеры ccMain_Camera, тогда предварительно выключим камеру если она включена fmMain.ccMain_Camera.Active := False; затем меняем "качество" fmMain.ccMain_Camera.Quality := TVideoCaptureQuality.MediumQuality; {включит 640*480} затем включаем камеру fmMain.ccMain_Camera.Active := True; типа так можно. FMX.Media.Android.zip З.Ы. и в OnSampleBufferReady надо обрабатывать уже полученное изображение, а не пытаться переключать камеру. P.P.S. это под XE7
  9. А что Вам мешает сделать сразу PNG-иконку с нужной прозрачностью, и подгружать ее, а не мучать TransparentColor и т.п.?
  10. В итоге не совсем понятно - чего же Вы хотите добиться? Если перевести проект из VCL в Firemonkey, то посмотрите данную ссылочку (и соответственно) OpenGL? Если Вы используете в своем проекте, созданном под VCL, библиотеку OpenGL, то, думаю, будет немного сложнее... Если нет, то Вам ничего не нужно "делать". С Firemonkey Вам не нужно задумываться над тем - что и где используется. Потому-что создавая FMX проект, все происходит "автоматически". В смысле - под Windows Ваш проект сбилдится так, что будет работать с DirectX, под остальное - OpenGL. (в общем виде) Так-что либо уточните свой вопрос, либо более четко его сформулируйте. Иначе, не понятно, что Вы хотите узнать.
  11. Не могу) Я не использую ImageList Я использую собственные контейнеры для хранения изображений. Они схожи со "старым" TImageList из VCL, но с более широкими возможностями.
  12. Я бы советовал Вам посмотреть вот эту тему
  13. Да! Еще забыл. Тут об этом много уже писалось. Если у вас есть не одно изображение в ListBoxItem, или одно, но не "стандартное" 'icon', то Вам нужно сделать следующее: Item.OnApplyStyleLookup := MyItemApplyStyle; где MyItemApplyStyle(Sender: TObject) - процедура, где Вам нужно перерисовать ваш битмап типа: procedure MyItemApplyStyle(Sender: TObject); var StyleObject: TFmxObject; begin if Assigned(TListBoxItem(Sender)) then with TListBoxItem(Sender) do try BeginUpdate; StyleObject := FindStyleResource('imageaction') as {тут ваш объект, например, TImage}; if Assigned(StyleObject)then begin TImage(StyleObject).Bitmap.Canvas.BeginScene(); try TImage(StyleObject).Bitmap := {здесь грузите ваш битмап}; finally TImage(StyleObject).Bitmap.Canvas.EndScene; end; ............ finally EndUpdate; end; end; З.Ы. За возможные ошибки - сорри, писал "на коленке" З.З.Ы. И не бойтесь грузить картинки из файлов - это все-равно будет очень быстро.
  14. Попробуйте так: procedure TReadActionFromDB.Sync; begin if Assigned(fonReadAction) then TThread.Synchronize(TThread.CurrentThread, procedure begin fonReadAction(Self, fTime, fActionName, fRecordNumber, fActionID); end); end; кроме того, aBitmap := TBitmap.CreateFromStream(aFileStream); Item.StylesData['imageaction'] := TValue.From<TBitmap>(aBitmap); Item.StylesData['imageaction.visible'] := True; Item.ItemData.Bitmap.Assign(aBitmap); 'imageaction' - что это за объект? (в смысле - зачем в один Item дважды засовывать одно изображение?)
  15. Только если Вы сделаете TThread.Synchronize(TThread.CurrentThread, {тут процедура отрисовки вашего bitmap}) из того самого "второстепенного" потока.
  16. Отличия могут быть в *.fmx файле. Иногда такое случается, особенно когда компоненты копируются с формы на форму или переносятся (копированием) из другого проекта.
  17. Странно. Но у меня везде все работает (и на десктопе и на мобильном). Без всяких "изменений".
  18. PFormStyle(@FormStyle)^ := TFormStyle.Popup; Нельзя ли чуть подробнее? Что есть что? Какой у Вас стиль формы Form2 в DesignMode? З.Ы. Нужна форма со свойством StayOnTop, но в тоже время не получающая фокус, в момент когда она отображается (Show или Visible := True). Просто форма со свойством Popup не подходит, так как она исчезает при получении фокуса любой другой формой приложения.
  19. Может я тормоз, но нигде не наблюдаю этого свойства у окна. И вообще нигде его не наблюдаю в исходниках... (XE7-XE8) З.Ы. повторюсь - если не ошибюсь, то в более старых версиях (XE4-5) нечто такое было, и оно работало. Сейчас такого нет.
  20. Нужна именно отдельная форма, самостоятельная, не имеющая отношения к первой. А не элемент первой формы.
  21. Это "подпись" приложения. Думаю Вам нужно посмотреть Android Mobile Application Development и Creating a Keystore File
  22. Что за проект? Если не трудно скинь код реализации панелей в listbox. Заранее спасибо! Проект. Кусок стиля: object TLayout StyleName = 'listboxitemmessagestylelight' EnableDragHighlight = False Padding.Left = 4.000000000000000000 Padding.Top = 4.000000000000000000 Padding.Right = 4.000000000000000000 Padding.Bottom = 4.000000000000000000 Position.X = 416.000000000000000000 Position.Y = 392.000000000000000000 Size.Width = 220.000000000000000000 Size.Height = 70.000000000000000000 Size.PlatformDefault = False Visible = False TabOrder = 91 object TRectangle StyleName = 'rectMain' Align = Contents Corners = [] EnableDragHighlight = False Fill.Color = claWhite HitTest = False Size.Width = 220.000000000000000000 Size.Height = 70.000000000000000000 Size.PlatformDefault = False end object TText StyleName = 'detail' Align = Client ClipChildren = True Cursor = crHandPoint EnableDragHighlight = False HitTest = False Margins.Right = 22.000000000000000000 Size.Width = 136.000000000000000000 Size.Height = 36.000000000000000000 Size.PlatformDefault = False TextSettings.Trimming = Character end object TActiveStyleTextObject StyleName = 'text' Align = Top EnableDragHighlight = False Margins.Right = 22.000000000000000000 Position.X = 58.000000000000000000 Position.Y = 4.000000000000000000 Size.Width = 136.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Style = [fsBold] TextSettings.Trimming = Character TextSettings.WordWrap = False Shadow.Color = claBlack Shadow.Offset.XI = 1 Shadow.Offset.YI = 1 ShadowVisible = False ActiveTrigger = Selected ActiveColor = claBlack ActiveShadow.Color = claBlack ActiveShadow.Offset.XI = 1 ActiveShadow.Offset.YI = 1 end object TCircle StyleName = 'roundavatar' Align = MostLeft EnableDragHighlight = False Fill.Bitmap.WrapMode = TileStretch Fill.Kind = Bitmap HitTest = False Margins.Left = 2.000000000000000000 Margins.Right = 4.000000000000000000 Position.X = 6.000000000000000000 Position.Y = 4.000000000000000000 Size.Width = 48.000000000000000000 Size.Height = 62.000000000000000000 Size.PlatformDefault = False Stroke.Color = claGray Stroke.Thickness = 2.000000000000000000 end object TText StyleName = 'btnclosemessage' Anchors = [akTop, akRight] EnableDragHighlight = False Opacity = 1.000000000000000000 Position.X = 194.000000000000000000 Position.Y = 4.000000000000000000 Size.Width = 26.000000000000000000 Size.Height = 26.000000000000000000 Size.PlatformDefault = False Text = #58882 TextSettings.Font.Family = 'spherelive' TextSettings.Font.Size = 26.000000000000000000 TextSettings.WordWrap = False end end Фрагменты кода: procedure TfmMissMessages.MissMessageApplyStyle(Sender: TObject); var StyleObject : TFmxObject; begin (Sender as TListBoxItem).OnClick := MessageItemClick; StyleObject := TListBoxItem(Sender).FindStyleResource('btnclosemessage') as TText; if Assigned(StyleObject) then TText(StyleObject).OnClick := DelMissMessageItemClick; StyleObject := TListBoxItem(Sender).FindStyleResource('roundavatar') as TCircle; if Assigned(StyleObject) then try TCircle(StyleObject).Fill.Bitmap.Bitmap.Canvas.BeginScene(); TCircle(StyleObject).Fill.Bitmap.Bitmap := {тут ваш битмап}; finally TCircle(StyleObject).Fill.Bitmap.Bitmap.Canvas.EndScene; end; end; procedure TfmMissMessages.AddMissMessageItem(......... AText: string); var newItem : TListBoxItem; newHeight : Integer; StyleObject: TFmxObject; begin .......... newItem := TListBoxItem.Create(nil); newItem.AutoTranslate := False; newItem.ClipChildren := True; newItem.CanFocus := False; newItem.EnableDragHighlight := False; newItem.Height := C_HeightItemMessage; newItem.Margins.Bottom := 5; newItem.StyledSettings := [TStyledSetting.Family, TStyledSetting.Style, TStyledSetting.FontColor]; newItem.TextSettings.HorzAlign := TTextAlign.Center; newItem.Text := AText; newItem.HitTest := True; newItem.OnClick := MessageItemClick; newItem.OnApplyStyleLookup := MissMessageApplyStyle; StyleObject := newItem.FindStyleResource('btnclosemessage') as TText; if Assigned(StyleObject) then TText(StyleObject).OnClick := DelMissMessageItemClick; StyleObject := newItem.FindStyleResource('roundavatar') as TCircle; if Assigned(StyleObject) then try TCircle(StyleObject).Fill.Bitmap.Bitmap.Canvas.BeginScene(); TCircle(StyleObject).Fill.Bitmap.Bitmap := {тут ваш битмап}; finally TCircle(StyleObject).Fill.Bitmap.Bitmap.Canvas.EndScene; end; lbxMissMessage.BeginUpdate; lbxMissMessage.AddObject(newItem); lbxMissMessage.EndUpdate; end; procedure TfmMissMessages.DelMissMessageItem(Sender: TListBoxItem); var newHeight : Integer; begin if not Assigned(Sender as TListBoxItem) then Exit; ............. lbxMissMessage.Items.Delete(TListBoxItem(Sender).Index); end; Извините, некоторые фрагменты кода удалены... Но думаю и так будет все понятно.
×
×
  • Создать...