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

AngryOwl

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

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

  • Посещение

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

    45

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

  1. Ввиду неудачной попытки реализовать данную функцию, перевел данный вопрос в "Задачи" http://fire-monkey.ru/topic/499-zadacha-android-dobavlenie-vozmozhnosti-ukazyvat-raz/
  2. Спасибо за помощь и понимание, но, в итоге, задача остается прежней. К сожалению мне не получилось достичь нужного результата. И в конкретном случае мне проще попросить специалиста выполнить задачу, чем терять время на попытки ее решения (а такового у меня нет). Задача сводится к следующему: - Написать и проверить на возможных устройствах модуль/процедуры/функции (не принципиально - главное чтобы работало корректно), реализующие установку заданного разрешения изображения при захвате с камеры.
  3. Имеем: Среда: Delphi XE6 OS: Android 4.0.3 и выше В проекте используется TCameraComponent. Для разработки/тестирования можно использовать любой пример из установленного пакета с демонстрацией работы камеры. Проблема: При включении камеры, захвате изображения и вывода его на экран, происходит следующее: - Захват кадров происходит с разрешением установленным "по умолчанию". Чаще всего - в очень высоком разрешении. Задача: Изменить параметры инициализации камеры (на мобильнике/планшете) при включении (либо в любой другой момент времени), для установки собственного разрешения из возможных доступных. Например, включить захват с разрешением 640*480 (640*360, не принципиально). P.S. Не предлагать решение с приведением захваченного изображения к нужному, посредством масштабирования (изменения размера изображения после его захвата). P.S.S. Надеюсь - корректно описал задачу. В итоге - нужен либо "исправленный" стандартный модуль FMX, либо процедуры/функции для работы с данными свойствами.
  4. Здравствуйте! Хотел бы опубликовать у Вас задачу для выполнения по теме http://fire-monkey.ru/topic/497-izmenenie-parametrov-kamery/ Как правильно я должен это сделать? Какие условия для публикации задачи? Кого в качестве исполнителя, если такой найдется, я могу выбрать? Заранее благодарен за ответ!
  5. Я "вдоль и поперек" перелопатил и класс Camera.Parameters, и все вышеуказанные методы. Но пока что-то не срасталось... Хотя не покидает ощущение, что вот-вот вопрос решится, и просто где-то что-то пропустил. Еще раз спасибо за инфу и за класс Camera.Parameters, а то я про него уже успел забыть. О результатах и решении проблем в любом случае отпишу в эту тему. (Кроме возможных доп.вопросов))
  6. Спасибо! Я читал Вашу статью "Как создавать обёртки для JAVA-кода". Возможно чего-то не понял или упустил. Проверю, и с использованием Androidapi.JNI.Hardware тоже. О результатах сообщу.
  7. Уважаемые гуру! Подскажите, что не правильно в коде? И самое главное - как именно использовать данные интерфейсы (Java классы). Имеем модуль (исходники на https://github.com/FMXExpress/android-object-pascal-wrapper/blob/master/android-19/android.hardware.Camera_Size.pas#L32) unit android.hardware.Camera_Size; interface uses AndroidAPI.JNIBridge, Androidapi.JNI.JavaTypes; type JCamera_Size = interface; JCamera_SizeClass = interface(JObjectClass) ['{3CB31FD5-10EB-4FDB-9AF1-768748A6454B}'] function _Getheight : Integer; cdecl; // A: $1 function _Getwidth : Integer; cdecl; // A: $1 function equals(obj : JObject) : boolean; cdecl; // (Ljava/lang/Object;)Z A: $1 function hashCode : Integer; cdecl; // ()I A: $1 function init(w : Integer; h : Integer) : JCamera_Size; cdecl; // (Landroid/hardware/Camera;II)V A: $1 procedure _Setheight(Value : Integer) ; cdecl; // A: $1 procedure _Setwidth(Value : Integer) ; cdecl; // A: $1 property height : Integer read _Getheight write _Setheight; // I A: $1 property width : Integer read _Getwidth write _Setwidth; // I A: $1 end; [JavaSignature('android/hardware/Camera_Size')] JCamera_Size = interface(JObject) ['{0ACB3AB0-AC98-4575-BD3D-1821B1C6B525}'] function _Getheight : Integer; cdecl; // A: $1 function _Getwidth : Integer; cdecl; // A: $1 function equals(obj : JObject) : boolean; cdecl; // (Ljava/lang/Object;)Z A: $1 function hashCode : Integer; cdecl; // ()I A: $1 procedure _Setheight(Value : Integer) ; cdecl; // A: $1 procedure _Setwidth(Value : Integer) ; cdecl; // A: $1 property height : Integer read _Getheight write _Setheight; // I A: $1 property width : Integer read _Getwidth write _Setwidth; // I A: $1 end; TJCamera_Size = class(TJavaGenericImport<JCamera_SizeClass, JCamera_Size>) end; implementation procedure RegisterTypes; begin TRegTypes.RegisterType('android.hardware.Camera_Size', TypeInfo(android.hardware.Camera_Size.JCamera_Size)); end; initialization RegisterTypes; end. При попытке вызова метода имею ошибку var CameraSize : JCamera_Size; ... CameraSize := TJCamera_Size.JavaClass.init(640, 480); ... Может я чего-то не понял или допустил ошибку, но при любой попытке обратиться к TJCamera_Size, ведрофон ругается "Java class JCamera_Size could not be found". P.S. Я в курсе темы http://fire-monkey.ru/topic/397-kak-osuschestvit-sviaz-mezhdu-delphi-interfeisom-i-java-kl/ но именно поэтому и спрашиваю, что вроде бы все так как надо, а не работает...
  8. 1. Только-что попробовал именно Ваш код - он дает один и тот же результат по скорости, не зависимо от того - сколько раз нажимать... Вывод: Вы либо что-то не дописали в своем примере, либо не точно описали последовательность. Даже не знаю... 2. Ну действительно - просто так не делается. Думаю, что не ошибусь если скажу - Вам не пишут потому, что Ваш "пример" плохой с точки зрения и ООП и вообще. Зачем Вы используете TScrollBox? Насколько я понимаю Вам нужен некий список. Единственное его отличие от стандартного TListBox может быть в том, что Вам нужны какие-то "свои" элементы. Ну так используйте в этом случае, предназначенный для "списков" TListBox, только с TListBoxItem со своим стилем... Это позволит Вам оперировать объектами (любыми!) "закрепленными" за каждым элементом списка, используя свой стиль (внешний вид элементов может быть таким, на что способна Ваша фантазия вообще (благо FMX позволяет в этом смысле вообще не иметь границ). Кроме того - работа TListBox оптимизирована по скорости, на мой взгляд, отлично, и избавит Вас от необходимости ковыряться со сложностями типа динамических массивов и записей. P.S. Если я в чем-то не прав, и Вы не хотите здесь писать Ваш код, то напиши более точно - какие задачи перед Вами стоят и что в итоге Вы хотите получить.
  9. "Height - не работает" а в Вашем TListBox, в котором Вы меняете Item'ы, свойство ItemHeight случаем <> 0 ? В смысле - если ItemHeight <> 0, то изменение свойства Height для любого TListBoxItem работать не будет P.S. Вот простой пример, который только-что опробовал и он прекрасно работает именно так, как Вам нужно (удаляет выбранный элемент списка с анимацией) ... TListBoxItem(TListBox(Sender).Selected).AnimateFloat('Opacity', 0, 0.3); TListBoxItem(TListBox(Sender).Selected).AnimateFloatWait('Height', 0, 0.3); TListBox(Sender).Items.Delete(TListBox(Sender).Selected.Index); ... P.P.S. проверил - все работает и на Windows и на Android. корректно и с анимацией
  10. 1. Использование t1:=Now; t2:=Now; и MilliSecondsBetween(t2,t1) не даст в Вашем случае точного результата. Подозреваю, что он всегда будет разным, и разница может быть очень существенной. Однозначно, лучше использовать TThread.GetTickCount для того чтобы "засечь время". 2. BeginUpdate; ... EndUpdate; Application.ProcessMessages; Это тоже не "выход из положения". Если хотите точно засечь именно время "отрисовки", то нужно использовать TThread.Synchronize(TThread.CurrentThread, ......... 3. Для чего Вы используете BeginUpdate и, соответственно, EndUpdate? Ведь в вашем случае они относятся к объекту Self, т.е. - к самой форме. 4. И самое главное. Простите за откровенность - как-то все очень "криво"... Все очень и очень НЕ "правильно" ) Может со мной не согласятся наши уважаемые гуру и кто-то захочет точно пояснить - почему у Вас происходит описанный Вами баг, но так не делается. Не поймите меня не правильно - я не хочу никого обидеть (когда-то мы все такими были, и я в том числе))). P.S. И еще возник сразу вопрос - это FMX-проект? Если да, то почему Вы не используете стили? Думаю, что зто Вам сильно упростило бы Ваши задачи, а заодно, и создали бы более удобный вариант (я бы даже сказал - более правильный с точки зрения ООП). Динамические массивы и "записи" - без них часто не обойтись, либо можно, но проще с ними. Но это не в Вашем случае.
  11. Встречный вопрос (чтобы быть более точным в возможных ответах) - Используете ли Вы в своем проекте компонент TStyleBook?
  12. TListBoxItem(ваш_item).Animate('Opacity', 0, 0.5); TListBoxItem(ваш_item).AnimateWait('Height', 0, 0.5); и только после этого удаляйте. Но здесь может возникнуть ряд проблем. Во-первых - оптимально делать синхронизацию. Во-вторых - ввиду "ряда особенностей" FMX все может работать на Windows 8, но не будет работать (или будет, но с ошибками) на Windows 7. А на Windows XP вообще может себя повести в "3-ем варианте"... ) Более стабильно будет работать на Маке и на Android ))) Вот такие чудеса могут быть. Чтобы всего этого избежать, Вам нужно точно определить ту последовательность, которую Вы хотите воспроизвести и сделать синхронизацию. Например, как писал выше: TListBoxItem(ваш_item).Animate('Opacity', 0, 0.5); TListBoxItem(ваш_item).AnimateWait('Height', 0, 0.5); // тогда Animate для 'Opacity' и 'Height' выполнится параллельно // а вот следующая процедура выполнится только после окончания AnimateWait 'Height' TThread.Synchronize(TThread.CurrentThread, тут_ваша_процера_удаления_item); Думаю, что корректно описал - как. Но было бы более точно и правильно, если бы на ваш вопрос ответил непосредственно Ярослав Бровин. Он все-таки более компетентен.
  13. Самый простой способ - отредактировать стиль, добавив копию "donetoolbutton", но обозвав ее иначе, например "donetoolrectbutton". Создав копию, и обозвав ее "donetoolrectbutton", у вас останется и старый стиль и будет новый (собственный). А вот с "donetoolrectbutton" вы уже можете делать что пожелаете. Т.е. - добавить в слой новый объект - тот же TRectangle. Можете изменить и "родной" стиль, добавив ему то, что требуется. P.S. Как создать копию... На мой взгляд - проще всего в том же редакторе (например Notepad++).
  14. Вам требуется, в первую очередь, подключить модули для возможности использования HBITMAP uses ... {$IFDEF MSWINDOWS} Vcl.Graphics, {$ENDIF} ... Далее, предположим, у Вас есть изображение tmpBmp - в формате Vcl.Graphics.TBitmap (для примера - я его гружу из файла. Это как-раз тот формат, о котором идет речь в Вашем вопросе) Ну и далее все действия Вам должны быть понятны.. var tmpBmp : Vcl.Graphics.TBitmap; tmpStream : TMemoryStream; begin tmpBmp := Vcl.Graphics.TBitmap.Create; try tmpBmp.LoadFromFile('d:/index_cr.bmp'); tmpStream := TMemoryStream.Create; tmpBmp.SaveToStream(tmpStream); Image1.Bitmap.LoadFromStream(tmpStream); finally tmpBmp.Free; tmpStream.Free; end; end; Думаю, что все достаточно просто и понятно написал P.S. все написано "на коленке" и за пару минут, так-что сорри, что не учитывал все "нюансы". Собственно FMX сделает за вас всю работу по преобразованию...
×
×
  • Создать...