Search results for '파이어몽키'

  1. 2014.01.29 -- 파이어몽키로 만든 3D CubeMan
  2. 2014.01.28 -- [FMX] 모바일 앱 라이프사이클 이벤트 처리하기
  3. 2014.01.28 -- 매주 금요일 제공되는 파이어몽키 스타일파일
  4. 2014.01.28 -- 안드로이드 Kitkat 스타일 업데이트
  5. 2014.01.28 -- iOS SquareCam을 FireMonkey 마이그레이션하기
  6. 2014.01.28 -- [소스공개] WordLine(낱말맞추기)
  7. 2014.01.21 -- 62개의 파이어몽키 이미지 효과(Effects)
  8. 2014.01.20 -- 모바일 프로젝트 빠른 컴파일로 구현내용 확인하기
  9. 2014.01.20 -- 모바일개발 시작하기(기초) - 멀티플랫폼 네이티브 모바일개발(파이어몽키) (1)
  10. 2014.01.03 -- RAD Studio Update2에서 iOS Device 컴파일 시 "file not found: libmidas.a" 오류 시 패치
  11. 2013.12.27 -- 파이어몽키 모바일(iOS, Android)에서 사용자 파일 배포 및 사용
  12. 2013.12.16 -- 안드로이드 API를 파이어몽키에서 사용하기(Toast 메시지 구현) (6)
  13. 2013.12.15 -- Firemonkey에서 Android Toast Message 사용하기
  14. 2013.12.13 -- Image URL로 TImage에 이미지 로드 (4)
  15. 2013.12.12 -- Delphi XE5 and RAD Studio XE5 Android and iOS Code Samples
  16. 2013.12.05 -- StyleBook Resources Text Editor 패치
  17. 2013.03.05 -- [FMX] 다이나믹한 UI 효과 - Float animation effect
  18. 2013.02.28 -- 메인폼을 얼리지 않고(Idle 상태) 대기하기.(TStopWatch 활용)
  19. 2012.10.04 -- [FM2] XE3.FM2에서 Control을 Bitmap으로 내보내기 및 Bitmap.Pixels 사용하기
  20. 2012.06.23 -- [FMX] Firemonkey 구조 - 어떻게 하나의 코드로 여러 플랫폼에서 실행 될까?

파이어몽키로 만든 3D CubeMan

2014.01.29 14:31


파이어몽키 3d 컴포넌트와 FloatAnimation을 이용해 간단하고 도 멋진 샘플을 만들었네요.

몸에 머리, 팔, 다리를 하위로 구성하고 FloatAnimation으로 움직이는 애니메이션을 주었습니다.


돌려보시면 아쥐 귀엽게 뛰는 3DCubeMan을 보실 수 있습니다.


소스코드는 여기


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

[FMX] 모바일 앱 라이프사이클 이벤트 처리하기

2014.01.28 15:56

애플리케이션 이벤트핸들러를 등록하면 앱의 라이프 사이클 이벤트를 수신할 수 있습니다.


먼저 상단(interface) uses절에 FMX.Platform을 추가 후 이벤트 수신 용 이벤트를 아래와 같이 작성합니다.

function TForm1.AppEventHandler(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
begin
  Result := False;
  case AAppEvent of
    TApplicationEvent.FinishedLaunching: Log.d('FinishedLaunching');
    TApplicationEvent.BecameActive: Log.d('BecameActive');
    TApplicationEvent.WillBecomeInactive: Log.d('WillBecomeInactive');
    TApplicationEvent.EnteredBackground: Log.d('EnteredBackground');
    TApplicationEvent.WillBecomeForeground: Log.d('WillBecomeForeground');
    TApplicationEvent.WillTerminate: Log.d('WillTerminate');
    TApplicationEvent.LowMemory: Log.d('LowMemory');
    TApplicationEvent.TimeChange: Log.d('TimeChange');
    TApplicationEvent.OpenURL: Log.d('OpenURL');
  end;
end;

메인 폼 생성 시 이벤트 핸들러를 등록(SetApplicationEventHandler)합니다.

procedure TForm1.FormCreate(Sender: TObject);
var
  AEService: IFMXApplicationEventService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(AEService)) then
  begin
    AEService.SetApplicationEventHandler(AppEventHandler);
  end;
end;

아래 이벤트를 참고해 필요한 항목에 이벤트 발생 시 코드를 추가하세요.


애플리케이션 이벤트 플랫폼 별 지원 여부

 이벤트

 설명

 안드로이드 지원

 iOS 지원

 BecomeActive

 애플리케이션이 활성화 되었습니다.

 지원

 지원 

 EnteredBackground

 애플리케이션이 백그라운드로 진입했습니다.

 지원

 지원

 FinishedLaunching

 애플리케이션이 시작되었습니다.

 지원

 지원

 LowMemory

 디바이스 메모리가 부족하다는 경고입니다. 내부 메모리 사용량을 줄이세요.

 지원

 지원

 OpenURL

 url 요청을 받았습니다.

 X

 지원

 TimeChange

 시간에 큰 변화가 발생. 하루가 바뀐 경ㅇ나 서머타임이 시작 또는 끝난 경우 발생

 X

 지원

 WillBecomeForeground

 백그라운드의 애플리케이션이 활성화 되었습니다.

 지원

 지원

 WillBecomeInactive

 다른 애플리케이션이 활성화 되었습니다.

 지원

 지원

 WillTerminate

 사용자가 애플리케이션을 종료합니다.

 지원

 지원


안드로이드 라이프사이크

http://developer.android.com/reference/android/app/Activity.html


iOS 라이프사이크


https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html


참고 글


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

매주 금요일 제공되는 파이어몽키 스타일파일

2014.01.28 09:41

모바일과 데스크탑용 파이어몽키 스타일파일을 매주 금요일마다 제공한다는 아주 반가운 소식이 있어 전합니다.

한주에 하나씩 공개를 하고, 현재 2가지의 스타일을 제공해 다운로드받을 수 있습니다.

스크린샷을 보면 정말 멋지네요^^


아래의 링크에서 매주 새로운 스타일을 만나보세요.

http://blogs.embarcadero.com/tlaborde


The Friday's Design #1




http://blogs.embarcadero.com/tlaborde/2014/01/17/the-fridays-design-1-firemonkey-desktop-and-mobile-design-with-delphi-xe5/


The Friday's Design #2



http://blogs.embarcadero.com/tlaborde/2014/01/24/the-fridays-design-2-firemonkey-desktop-design-with-delphi-xe5/



저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키 Firemonkey, Friday's design, style

안드로이드 Kitkat 스타일 업데이트

2014.01.28 09:19


안드로이드 KitKat 스타일이 업데이트 되었습니다. 더 다양한 화면을 구성할 수 있게 되었네요.


http://blogs.embarcadero.com/sarinadupont/2014/01/23/android-kitkat-style-download-for-xe5


다운로드

http://cc.embarcadero.com/item/29701

저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

iOS SquareCam을 FireMonkey 마이그레이션하기

2014.01.28 09:09



 파이어몽키에서 제공하는 TCameraComponent도 매우 훌륭하지만 디지털 줌이나 얼굴인식등의 카메라 특화기능이 필요한 경우 해당 글을 참고하시면 iOS에서 SquareCam(iOS제공)을 활용하는 방법을 습득할 수 있습니다.

 더불어 iOS 라이브러리 사용하는 방법을 익히는 부분도 도움이 될 것 같아요.


소스코드


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

[소스공개] WordLine(낱말맞추기)

2014.01.28 08:59


 구글플러스 친구(?)인 Roman Yankovsky(https://plus.google.com/u/0/+RomanYankovsky/posts)가 낱말맞추기 소스코드를 공개했네요.

 구글플레이에 올라간 앱의 소스코드와 윈도우용 실행파일을 제공해줬습니다.(Thank you!!)


소스코드


윈도우용 실행파일





저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

62개의 파이어몽키 이미지 효과(Effects)

2014.01.21 22:10


Firemonkey에 내장된 ImageFX 엔진은 GPU를 사용하는 62가지의 Effects를 제공합니다. 

(안드로이드와 iOS에서는 OpenGL을 이용하여 이미지를 랜더링합니다.)


Effects는 Non-visual 구성요소로 컴포넌트에 올려 놓고(Child로 구성) 속성을 변경하는 것 만으로 풍부한 이미지 효과를 표현할 수 있습니다.

Effects는 Trigger를 이용하여 사용자의 이벤트에 따라 효과를 발생 시킬 수 있어 앱의 완성도를 높이기 위해서는 필수로 사용해야 합니다.(이미 스타일에는 Effects가 다수 포함되어 있습니다.)


파이어몽키 이미지 효과 소개

http://docwiki.embarcadero.com/RADStudio/XE5/en/FireMonkey_Image_Effects


이미지 효과를 적용하는 방법

http://docwiki.embarcadero.com/RADStudio/XE5/en/Applying_FireMonkey_Image_Effects


파이어몽키 이미지 효과 사용

http://docwiki.embarcadero.com/RADStudio/XE5/en/Using_FireMonkey_Image_Effects


샘플 코드

http://docwiki.embarcadero.com/CodeExamples/XE5/en/FMX.ShaderFilters_Sample











저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

모바일 프로젝트 빠른 컴파일로 구현내용 확인하기

2014.01.20 11:01

이번 팁은 모바일의 기능확인을 윈도우 상에서 매우 간단하게 할 수 있는 방법입니다.


모바일 프로젝트 구성 초기 단계는 코딩이 정확히 되었는지 확인하는 단계를 많이 갖습니다. 하지만 모바일 프로젝트는 컴파일하는데 시간이 꽤 걸리곤 해서 조금 불편합니다.


그리고 

모바일 화면의 구성 확인 및 UX 확인을 위해 매번 모바일이나 애뮬레이터를 사용하려면 시간도 많이 걸리고 번거롭습니다.


이럴때에는 멀티플랫폼 개발의 특징을 살려 컴파일 및 실행 속도가 제일 빠른 32-bit Windows를 타겟으로 컴파일할 수 있습니다.


32-bit Windows를 추가하는 방법

Project Manager > Project > Target Platform > 우측마우스버튼 > Add Platform


위와 같이 32-bit Windows를 선택하면 아래와 같이 32-bit Windows를 선택하고 컴파일, 실행하시면 편리하게 사용할 수 있습니다.



개발시 편리하게 확인하기 위한 용도로 사용해야 하구요.

배포 전 테스트 시에는 반드시 해당 플랫폼에서 실제기기를 이용해서 테스트 해야합니다.


컴파일 단축키도 알고계시면 빠르고 편리하게 이용할 수 있습니다.

컴파일 단축키

Ctrl + F9               - Compile(변경된 부분 컴파일)

F9                       - Run(컴파일 이후 실행)

Shift + Ctrl + F9     - Run without Debugging(디버깅모드 사용하지 않고 실행)

Shift + F9             - Build(관련 코드 전체 컴파일)


Compile과 Build의 차이

 - 델파이의 Compile은 이전의 컴파일 이후 변경된 부분만 분석하므로 매우 빠르게 진행됨

 - Build는 링크된 다른 유닛 및 라이브러리를 전체적으로 컴파일하므로, 라이브러리 등이 변경된 경우 반드시 잔향해야 함


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

모바일개발 시작하기(기초) - 멀티플랫폼 네이티브 모바일개발(파이어몽키)

2014.01.20 10:27


안녕하세요. 험프리.김현수 입니다.

델파이로 모바일 개발을 하시는 분들 중 많은 분들이 참고할 자료가 없다고 말씀하시는데요. 알고보면 다양한 팁과 자료, 샘플들이 꽤 있어서 한곳에 모으는 작업이 필요할 것 같아 글을 작성합니다.

(물론,  발매 초기여서 기존의 다른 언어/툴 처럼 넘처나는 자료들은 없지만 여러분의 관심과 사랑이 자료를 풍성하게 하지 않을까 싶네요^^ 파이어몽키에 관심 많이 갖어주세요.)


이 아티클은 그런 팀과 참고자료, 샘플들을 한곳에 모으는 역할을 하려 합니다.


제가 알고 있는 자료들을 우선 등록하고 꾸준하게 추가하려 하니 공유할만한 자료들이 있다면 댓글 또는 hjfactory@gmail.com으로 메일 주시면 감사하겠습니다.


(현재 초안 작성 중입니다. 혹시 궁금하신 점 있으시면 댓글 주세요.)

Embarcadeoro 기술문서

 뭐니뭐니해도 개발사에서 제공하는 기술자료가 제일 풍부하고, 정확합니다. RAD Studio도 엠바카데로에서 제공하는 기술문서에는 기본적인 환경설정, 개념, 샘플 등 매우 다양하고 많은 양의 문서를 제공합니다.

  하지만, 언어의 장벽이 간혹 문제가 되기도 하는데요. 아래의 번역팁을 이용하시면 더 쉽게 문서를 보실 수 있을겁니다.

기술문서 번역 팁

  • 일본어 문서를 번역 할 것 - 영어를 번역하는 것 보다 어순이 같고, 번역 DB가 많아서 아주 매끄러운 번역이 됩니다.
  • 엠바카데로 일본어 문서는?

아래와 같은 품질로 번역됩니다.

동영상 따라하기

▶ 데브기어 동영상

모바일 프로젝트를 시작할때에 환경설정이 반은 차지하는 것 같습니다. 데브기어에서 제공하는 동영상 강좌를 따라하시면 환경설정 부터 기본적인 기능을 따라할 수 있어 무척 도움이 됩니다.


데브기어 Youtube채널



Firemonkey 튜토리얼(C++빌더 기준, 델파이 동일)

▶ Embarcadero 동영상

엠바카데로 Youtube 채널(영문)


CodeRage 8 - Delphi comference

튜토리얼

▶ 기본 샘플

제일 기본적인 컴포넌트 사용법과 기본기능을 학습할 수 있는 동영상과 샘플코드를 확인할 수 있습니다.


▶ 튜토리얼

환경 설정부터 UI 구성, 장비제어 그리고 데이터 연결까지 유용한 정보를 따라하기 형태로 제공합니다.

꼭 방문하셔서 확인해 보세요.


참고문서

▶ 파이어몽키 심층분석: 컴포넌트와 스타일

마르코 칸투(델파이 프로젝트 매니저: Embarcadero) 저, 데브기어(http://www.devgear.co.kr) 역

파이어몽키 구조에서 컴포넌트와 스타일의 역할을 소개하고, 코드와 예제를 통해 상세하게 안내하는 문서입니다.

파이어몽키 사용법도 중요하지만, 구조를 이해하면 새로운 컨트롤들을 만들거나 더 유연하게 앱을 개발할 수 있을 것 같습니다.

파이어몽키 구조를 이해하는데 도움이 되는 문서이니 필독을 권합니다.



▶ 박지훈.임프님이 번역한 "모바일 개발을 위한 델파이 언어"

마르코 칸투(델파이 프로젝트 매니저: Embarcadero) 저, 박지훈(http://blog.devquest.co.kr/imp) 역

델파이 언어에 대한 심도있는 설명 및 문법을 배울 수 있는 좋은 문서입니다.


RAD Studio 기본 샘플

RAD Studio를 설치하면 기본적으로 제공되는 매우 다양한 샘플들이 있습니다.


C:\Users\Public\Documents\RAD Studio\n.n\Samples


참고하기 좋은 몇가지 샘플을 소개합니다. 소개된 샘플은 극히 일부로 직접 위 경로에서 다양한 샘플을 직접 돌려보세요.


StandardAction을 이용해 간단한 PhotoEditor 앱만들기


샘플위치 : [Samples] > FireMonkeyMobile > PhotoEditorDemo

(http://docwiki.embarcadero.com/CodeExamples/XE5/en/FMX.Mobile.PhotoEditorDemo_Sample_(Delphi))


아래의 내용을 습득할 수 있습니다.

  1. Standard Action 활용(카메라, 공유)

  2. 이미지 필터 효과 적용

  3. 폼팩터 별 폰과 태블릿 UI 적용


 RAD Studio에서 제공하는 Standard Action을 이용하여 "사진찍기", "사진앨범 접근", "사진공유" 등이 구현된 샘플입니다. 그와 더불어 사진에 필터효과를 효과적으로 적용하는 방법을 참고하시면 코드의 반복을 줄이는 코딩 스타일을 참고할 수 있습니다.

 그리고, 폰과 태블릿의 폼팩터에 맞는 UI를 구성하는 방법도 프로젝트 소스를 보시면 참고할 수 있습니다.



ListView의 Item 구조를 마음대로 만들기


샘플위치 : [Samples] > FireMonkeyMobile > ListView

(http://docwiki.embarcadero.com/CodeExamples/XE5/en/FMX.Mobile.ListViewRatingsAppearance_Sample_(Delphi))


아래의 내용을 습득할 수 있습니다.

  1. ListView Item의 Layout을 변경
  2. ListView.ItemAppearance 항목을 추가 방법
  3. Package를 만들고 Bpl 사용
 기본제공하는 몇개의 ListView Item만 이용하기에는 표현할 내용이 너무 많고 다양합니다. 여러분의 입맞에 맞는  ListViewItem의 Layout을 다양하고, 편리(LiveBinding에서도 사용가능)하게 구현할 수 있습니다.
 ItemAppearance는 Package로 구성되어 Bpl 형태로 생성됩니다. 이번 기회에 패키지를 만들고 사용하는 방법도 익히시는 일석이조의 샘플입니다.


DataSnap HTTP Tunneling Sample(DataSnap Server Failover 구현)


샘플위치 : [Samples] > Delphi > DataSnap > Failover

(http://docwiki.embarcadero.com/CodeExamples/XE5/en/DataSnap.Failover_-_DataSnap_HTTP_Tunneling_Sample)

    아래의 내용을 습득할 수 있습니다.

    1. DataSnap의 구성

    2. DataSnap Tunneling을 이용한 병렬화 구성

    3. DataSnap Failover

     모바일에서 Database연결을 위해 DataSnap을 사용하면 아주 훌륭하고 빠르고, 쉽게 구현할 수 있습니다. 그래서 DataSnap을 미들웨어 서버로 많이 사용하는데요. 서버란 모름지기 대용량 처리가 필요합니다. 물론 데이터 처리 및 접속방법을 효율적으로 구현해서 대용량 처리하는 것도 중요하지만 결과적으로 접속자 수가 많으면 병렬화처리가 필요한데 소프트웨어적으로 DataSnap Server를 병렬화 구성하는데 참고하면 좋은 샘플입니다.


    간단한 팁

    참고 사이트(국내)

    참고 사이트(해외)


    추가자료




    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키

    1. Blog Icon
      김동섭

      안녕하세요. Tcameracomponet를 사용하지 않고 androidapi.JNI.hardware의 java api을 사용해서 camera제어 하고 싶은데 어떻게 사용해야할지 잘모르겠습니다. 관련 샘플이 없어서..
      jcamera을 어떻게 선언하고 사용해야 하나요. 카메라 클래스를 설정하고 제어하고 싶습니다.
      감사합니다

    RAD Studio Update2에서 iOS Device 컴파일 시 "file not found: libmidas.a" 오류 시 패치

    2014.01.03 11:45


    위와 같은 메시지가 나오는 경우 아래의 링크를 타고 hotfix 패치 하세요.

    XE5 Update 2 업데이트 과정에서 몇개의 라이브러리가 누락되었습니다.


    패치대상

    • Delphi / C++ Builder XE5 Update2 사용자
    • iOS Device 배포가 필요한 경우


    Released 2 hotfixes for XE5 Update 2. Both are to address some missing files.

    http://cc.embarcadero.com/item/29667 - missing lib files in Delphi
    http://cc.embarcadero.com/item/29668 - missing header in C++


    다운받은 압축파일 해재 후 파일 복사만 하면 됩니다.


    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\debug\libibtogo.a

    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\debug\libmidas.a

    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\debug\libpcre.a

    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\debug\libsqlib.a


    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\release\libibtogo.a

    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\release\libmidas.a

    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\release\libpcre.a

    C:\Program Files\Embarcadero\RAD Studio\12.0\lib\iosDevice\release\libsqlib.a  



    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 hotfix, Rad Studio, XE5 Update2

    파이어몽키 모바일(iOS, Android)에서 사용자 파일 배포 및 사용

    2013.12.27 11:15

    사진 및 스타일파일등을 앱에 포함해서 배포할 일이 있습니다.

    iOS와 안드로이드에서 사용자의 파일을 배포하고 사용하는 방법입니다.


    우선 배포할 파일을 준비합니다.

    배포파일 추가는 IDE 메인메뉴에서 Project > Deployment 메뉴를 통해 할 수 있습니다.



    위의 Add files 버튼을 누르고 열기대화상자에서 배포할 파일을 선택합니다. 파일이 추가되면 목록에서 추가한 파일을 선택하고

    아래와 같이 플랫폼을 iOS와 Android로 선택하고 Remote Path를 변경합니다.



    iOS 배포파일 추가

    Platform - [iOSDevice, iOSSimulator]

    Remote Path - StartUp\Documents


    Android 배포파일 추가

    Platform - [Android]

    Remote Path - assets\internal


    배포파일을 코드에서 사용하려면 아래와 같은 코드로 가능합니다.


    uses
      System.IOUtils;
    
    procedure TForm3.Button1Click(Sender: TObject);
    begin
      Image1.Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'Koala.jpg'));
    end;


    관련글



    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 Deployment, Firemonkey, 파이어몽키

    안드로이드 API를 파이어몽키에서 사용하기(Toast 메시지 구현)

    2013.12.16 14:28
    안드로이드 API를 파이어몽키에서 사용방법을 공유합니다. 제가 이해한 내용 기반으로 작성해서 틀린부분이 있을 수 있으니 혹시 틀린부분이 보이시면 댓글달아 주세요.

    안드로이드 API 사용을 위해 파이어몽키로 변환할 대상은 안드로이드 Toast를 기반으로 설명하겠습니다.

    Toast는 아래의 그림과 같이 하단에 잠시 나타났다가 사라지는 메시지입니다. 파이어몽키에는 제공하지 않습니다.



    설명은 아래의 순서대로 진행하겠습니다.

    1, 안드로이드 API 문서확인
    2, 파이어몽키에서 안드로이드 API 접근 시 구성
    3, 안드로이드 API 컨버팅
    4, 사용법 및 샘플코드

    안드로이드 API 문서확인

    변환할 대상인 Toast의 안드로이드 문서는 아래 링크에서 확인 할 수 있습니다.


    위쪽 문서는 API 문서구요, 아래의 문서는 샘플코드 문서입니다.


    우선 위의 API문서를 보시면 대략 아래와 같은 단락으로 구성되어있으니 숙지해 주시구요.
    • Contants
    • Public Constructors
    • Public Methods - 
    • Inherited Methods
    • Fields(Toast에서는 미사용)


    파이어몽키에서 안드로이드 API 접근 시 구성

    unit Android.JNI.Toast;
    
    interface
    
    {$IFDEF ANDROID}
    uses
      Androidapi.JNIBridge,
      Androidapi.JNI.JavaTypes,
      Androidapi.JNI.GraphicsContentViewText;
    
    type
      JToast = interface;
    
      JToastClass = interface(JObjectClass)
      ['{F227353E-DCE9-404B-8129-6B1BEFE68151}']
        {Property methods}
        function _GetLENGTH_LONG: Integer; cdecl;
        function _GetLENGTH_SHORT: Integer; cdecl;
        {Methods}
        function init(context: JContext): JToast; cdecl; overload;
        function makeText(context: JContext; text: JCharSequence;
          duration: Integer): JToast; cdecl;
        {Properties}
        property LENGTH_LONG: Integer read _GetLENGTH_LONG;
        property LENGTH_SHORT: Integer read _GetLENGTH_SHORT;
      end;
    
      [JavaSignature('android/widget/Toast')]
      JToast = interface(JObject)
      ['{FC9B3DFD-38CC-4693-9F11-7F3E3647683F}']
        {Methods}
        procedure cancel; cdecl;
        function getDuration: Integer; cdecl;
        function getGravity: Integer; cdecl;
        function getHorizontalMargin: Single; cdecl;
        function getVerticalMargin: Single; cdecl;
        function getView: JView; cdecl;
        function getXOffset: Integer; cdecl;
        function getYOffset: Integer; cdecl;
        procedure setDuration(value: Integer); cdecl;
        procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl;
        procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl;
        procedure setText(s: JCharSequence); cdecl;
        procedure setView(view: JView); cdecl;
        procedure show; cdecl;
      end;
      TJToast = class(TJavaGenericImport<JToastClass, JToast>) end;
    {$ENDIF}
    
    implementation
    
    end.


    파이어몽키에서 Android API 사용하기 위해서는 JavaClass영역(JToastClass)과 JavaInterface영역(JToast)으로 구성 후 
    실제 파이어몽키에서 사용할 수 있는 Class(TJToast)로 Generic형태로 Import해 사용합니다.
    • JToastClass - JavaClass interface
    • JToast - JavaInterface interface
    • TJToast - Delphi에서 사용할 Class

    위와 같이 구성하기 위해서는 아래의 Unit들이 사용(uses)됩니다.
    • Androidapi.JNIBridge
    • Androidapi.JNI.JavaTypes
    • Androidapi.JNI.GraphicsContentViewText


    안드로이드 API 컨버팅

    델파이에서 구현할 부분은 크게 JavaClass와 JavaInterface입니다.

    안드로이드 API문서를 보며 어느 부분을 JavaClass와 JavaInterface에 구현할지에 대해 알아보겠습니다.



    위 그림의 붉은색 사각형에 포함된 내용이 JavaClass에 포함되고 나머지는 JavaInterface에 포함됩니다.


    JavaClass 구현 할 항목

      JToast = interface;
    
      JToastClass = interface(JObjectClass)
      ['{F227353E-DCE9-404B-8129-6B1BEFE68151}']
        {Property methods}
        function _GetLENGTH_LONG: Integer; cdecl;
        function _GetLENGTH_SHORT: Integer; cdecl;
        {Methods}
        function init(context: JContext): JToast; cdecl; overload;
        function makeText(context: JContext; text: JCharSequence;
          duration: Integer): JToast; cdecl;
        {Properties}
        property LENGTH_LONG: Integer read _GetLENGTH_LONG;
        property LENGTH_SHORT: Integer read _GetLENGTH_SHORT;
      end;
    • Inherited Methods
      • JToastClass = interface(JObjectClass)와 같이 안드로이드 API에 기술된대로(java.lang.Object) interface를 상속받아 사용합니다.
    • Constants(상수)
      • 안드로이드 API 상수는 Properties로 구성되며 read 절에 _Get을 추가하여 선언됩니다.
      • 만약, END, BEGIN과 같은 상수는 &END, &BEGIN과 같이 &를 앞에 추가하여 구성됩니다.
      • Property methods에 _Get이 포함된 read 함수가 선언되며 호출규칙은 cdecl으로 지정합니다.
    • Public Constructors(생성자)
      • 생성자는 init();로 선언되며, 안드로이드의 인자를 그대로 선언해 줍니다.
        (JContext 등의 클래스는 이미 엠바카데로에서 선언(Androidapi.JNI.GraphicsContentViewText)해 놓았으니 매번 구현할 필요없이 잘 찾아서 사용하면 될것 같네요.)
      • 생성자도 cdecl로 호출규칙을 지정하고, Init는 JObjectClass에서 이미 구현되었으므로 overload로 method를 분개합니다.
      • JavaInterface를 반환합니다.(그래서 JToast = interface;를 미리 선언해야 합니다.)
    • Public Methods(Static)
      • Public Methods에 나열된 메소드 중에서 static으로 선언된 메소드들은 JavaClass에 선언해야 합니다.
      • 저는 static으로 선언된 메소드 중 2번째인 CharSequence text가 2번째 인자로 들어간 메소드만 사용했습니다.
        (모든 메소드를 모두 구현해야 할 필요는 없습니다.)

    JavaInterface 구현 할 항목

      [JavaSignature('android/widget/Toast')]
      JToast = interface(JObject)
      ['{FC9B3DFD-38CC-4693-9F11-7F3E3647683F}']
        {Methods}
        procedure cancel; cdecl;
        function getDuration: Integer; cdecl;
        function getGravity: Integer; cdecl;
        function getHorizontalMargin: Single; cdecl;
        function getVerticalMargin: Single; cdecl;
        function getView: JView; cdecl;
        function getXOffset: Integer; cdecl;
        function getYOffset: Integer; cdecl;
        procedure setDuration(value: Integer); cdecl;
        procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl;
        procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl;
        procedure setText(s: JCharSequence); cdecl;
        procedure setView(view: JView); cdecl;
        procedure show; cdecl;
      end;
    
      TJToast = class(TJavaGenericImport<JToastClass, JToast>) end;

    • class path
      • 아래와 같이 API문서의 상단에서 class path를 확인하고 JavaSignature를 구성합니다.
    • Inherited Methods
      • JavaInterface도 JObject를 상속받습니다.
    • Public methods
      • Public methods에서 static으로 선언된 항목을 제외하고 선언합니다.
      • 대부분의 자료형은 이미 Androidapi.JNI.JavaTypes에 선언되었으나 해당 Unit을 참고합니다.


    마지막으로 JavaClass(JToastClass)와 JavaInterface(JToast)를 TJavaGernericImport 클래스를 이용해서 실제로 사용할 Delphi class를 선언할 수 있습니다.


    사용법 및 샘플코드

    var
      Toast: JToast;
    begin
      CallInUiThread(procedure
      begin
        Toast := TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(AMsg), TJToast.JavaClass.LENGTH_SHORT);
        Toast.show;
      end);
    end;


    위의 코드가 Toast 메시지를 화면에 출력하는 샘플코드입니다.

    안드로이드 가이드 문서를 참고해서 만들었습니다.


    안드로이드 API를 구현한 후에는

    TJToast.JavaClass이후에 JavaClass에 선언된 메소드들을 호출하고 반환받은 객체에서 JavaInterface의 메소드를 사용할 수 있습니다.


    그리고, CallInUiThread의 경우  UI와 관련된 경우 Thread 처리하지 않으면 화면이 얼어버리는 현상이 발생해서 추가했습니다.

    (그냥 구현했더니 얼어버려서, 엠바카데로 소스를 참고했습니다.)


    마치며

    대부분의 안드로이드 API는 이미 엠바카데로에서 구현해 놓았습니다.

    (C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\source\rtl\android 참고: 설치 기본경로 기준)


    다만, 안드로이드에 특화된 기능등은 구현되지 않은 것이 있을 것입니다.

    그럴경우 위에서 설명한 내용 참고하시면 충분히 포팅하여 사용할 수 있을것 같습니다.

    (제 글이 도움이 되었으면 좋겠네요. 만약 어려운 부분이 있으시면 답글 주세요. 함께 고민해 보겠습니다.)


    그럼 다음에는 iOS library 사용법이나 NDK 등의 글로 찾아뵙겠습니다.

    감사합니다.



    델파이 10.2 도쿄 버전에서는 아래 코드를 사용하면 됩니다.

    JToast 인터페이스는 공식적으로 Androidapi.JNI.Widget 유닛에 선언되었습니다.

    implementation
    
    uses
      Androidapi.Helpers,
      Androidapi.JNI.Widget;
    
    {$R *.fmx}
    
    procedure ToastMessage(const AValue: string);
    var
      Toast: JToast;
    begin
      Toast := TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(AValue), TJToast.JavaClass.LENGTH_SHORT);
      Toast.show;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ToastMessage('test');
    end;

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 android api, Android to firemonkey, Firemonkey, JNI, toast

    1. 좋아요!! 많이 눌러주세요^^

    2. Blog Icon
      GHat

      안녕하세요 델파이 공부중인 한 학생입니다..
      델파이에서 안드로이드의 nfc 기능을 사용하려니 컴포넌트도없고...
      어떻게해야할지 막막합니다ㅠㅠ
      toast메세지 구현한것처럼 AndroidAPI 를 직접 가져다가 컨버팅해야할것같은데.. 어떻게해야할까요?

    3. 반갑네요^^ 델파이를 공부하신다고 하니...
      NFC 개발이 필요하다면 우선 NFC에 대한 정보를 먼저 익히시고 관련 샘플을 델파이로 컨버팅하며 익혀야 합니다.

    4. Blog Icon
      김주일

      안녕하세요 ?
      델파이는 잘 모르고 C 빌더를 사용하고 있는 사람 입니다.

      다른건 모두 이해가 가는데
      ['{F227353E-DCE9-404B-8129-6B1BEFE68151}'] 와
      ['{FC9B3DFD-38CC-4693-9F11-7F3E3647683F}'] 는

      어떻게 정해지는지 모르겠습니다 ?
      그리고 C Builder 로도 API 인터페이스가 가능한가요 ?


    5. 해당 문자열은 GUID이며 Ctrl + Alt + G를 누르면 세상에서 유일한 ID를 생성하고 사용할 수 있습니다.
      API 인터페이스 처리하는 부분은 C++빌더로도 가능합니다.
      (하지만 방법은 좀더 찾아보셔야 겠네요^^)

    6. 보고 따라했는데도 안되어서 파일을 그대로 가져다가 프로젝트에 올리고 uses절에서 호출하고.. 실행문 가져다가 했는데 빨간줄이 나옵니다..
      실행방법 알고 싶습니다..

      CallInUiThread
      SharedActivityContext
      StrToJCharSequence

      어디에 정의되있는건가요..?

    Firemonkey에서 Android Toast Message 사용하기

    2013.12.15 23:54

    Android API를 Firemonkey에서 사용하는 방법을 설명하기 위해 

    Toast Message를 사용하는 방법을 샘플로 만들어 봤습니다.

    (다음 글에서는 컨버팅하는 방법을 설명하겠습니다.)


    아래의 화면과 같이 위치를 지정해서 토스트메시지를 출력하면 Lock걸지 않는 메시지가 나왔다가 사라집니다.

    (아래의 샘플은 100% Firemonkey(delphi)로 만들어 졌습니다.)



    혹시 확인해 보고 싶으신 분은 아래 APK 다운로드 해보세요.^^(당연히 iOS에서는 동작하지 않습니다.)



    토스트 메시지는 아래의 문서를 참고해서 컨버팅 했구요.

    http://developer.android.com/reference/android/widget/Toast.html


    토스트 메시지 위치를 지정하기 위해 아래의 문서도 컨버팅 했습니다.(그냥 상수처리해도 될걸 그랬는데요. 내주말 ㅠㅜ)

    http://developer.android.com/reference/android/view/Gravity.html


    관련된 소스는 아래의 Github사이트를 참고해주세요.(Follow 해주시면 감사하구요^^)

    https://github.com/hjfactory/FMX.Devgear/tree/master/Samples/Android_Toast


    대략 소스는 아래와 같습니다.



    다음 글에서는 안드로이 API를 파이어콩키에서 사용하는 자세한 방법을 설명해 보겠습니다.

    감사합니다.

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 android, Converte android to firemonkey, Firemonkey, FMX, toast, Toast Message

    Image URL로 TImage에 이미지 로드

    2013.12.13 00:37

    웹에 있는 이미지를 표시해야 할 것 같아 간단하게 라이브러리 형태로 만들었어요.

    TBitmap을 class helper로 확장했습니다.

    소스가 몇 줄 되지 않으니 설명은 생략합니다.


    iOS(아이폰5), Android(Nexus 7), 윈도우(Windows 7)에서 모두 정상 동작 확인했습니다.


    참고하세요^^







    사용법


    procedure TForm3.Button1Click(Sender: TObject);
    var
      Size: Int64;
    begin
      Image1.Bitmap.LoadFromUrl('http://cfile2.uf.tistory.com/image/2353573E529FDAAC032731', Size);
    
      Memo1.Lines.Add('1 : ' + Format('W: %d, H: %d, S: %d', [Image1.Bitmap.Width, Image1.Bitmap.Height, Size]))
    end;
    
    procedure TForm3.Button2Click(Sender: TObject);
    begin
      Image1.Bitmap.LoadFromUrl('http://cfile2.uf.tistory.com/image/2353573E529FDAAC032731');
    
      Memo1.Lines.Add('2 : ' + Format('W: %d, H: %d', [Image1.Bitmap.Width, Image1.Bitmap.Height]))
    end;
    
    procedure TForm3.Button3Click(Sender: TObject);
    begin
      Image1.Bitmap.LoadThumbnailFromURL('http://cfile2.uf.tistory.com/image/2353573E529FDAAC032731', 100, 100);
    
      Memo1.Lines.Add('3 : ' + Format('W: %d, H: %d', [Image1.Bitmap.Width, Image1.Bitmap.Height]))
    end;


    쓰레드로 처리하도록 변경해 사용법의 첫번째 사이즈 정보를 얻어오는 부분은 제외됩니다.

    (깃허브의 소스코드를 참고하세요. https://github.com/hjfactory/FMX.Devgear)

    구현부

    unit FMX.Devgear.HelperClass;
    
    interface
    
    uses
      System.Classes, FMX.Graphics;
    
    type
      TBitmapHelper = class helper for TBitmap
      public
        procedure LoadFromUrl(AUrl: string);
    
        procedure LoadThumbnailFromUrl(AUrl: string; const AFitWidth, AFitHeight: Integer);
      end;
    
    implementation
    
    uses
      System.SysUtils, System.Types, IdHttp, IdTCPClient, AnonThread;
    
    procedure TBitmapHelper.LoadFromUrl(AUrl: string);
    var
      _Thread: TAnonymousThread;
    begin
      _Thread := TAnonymousThread.Create(
        function: TMemoryStream
        var
          Http: TIdHttp;
        begin
          Result := TMemoryStream.Create;
          Http := TIdHttp.Create(nil);
          try
            try
              Http.Get(AUrl, Result);
            except
              Result.Free;
            end;
          finally
            Http.Free;
          end;
        end,
        procedure(AResult: TMemoryStream)
        begin
          if AResult.Size > 0 then
            LoadFromStream(AResult);
          AResult.Free;
        end,
        procedure(AException: Exception)
        begin
        end
      );
    end;
    
    procedure TBitmapHelper.LoadThumbnailFromUrl(AUrl: string; const AFitWidth,
      AFitHeight: Integer);
    var
      Bitmap: TBitmap;
      scale: Single;
    begin
      LoadFromUrl(AUrl);
      scale := RectF(0, 0, Width, Height).Fit(RectF(0, 0, AFitWidth, AFitHeight));
      Bitmap := CreateThumbnail(Round(Width / scale), Round(Height / scale));
      try
        Assign(Bitmap);
      finally
        Bitmap.Free;
      end;
    end;
    
    end.


    안드로이드 환경에서 8bit GIF 이미지가 표시되지 않는경우

    아래와 같이 FMX.Graphics.Android.pas 파일을 수정하세요. 결과적으로 IsGIFStream 메소드에서 GIF 여부를 파악하는 부분이 잘못되어 있어 8bit GIF 표시에 문제가 있습니다.

    class function TBitmapCodecAndroid.IsGIFStream(const Stream: TStream): Boolean;
    const
      IDCharCount = 3;
    type
      GIFByteArray = array[0..IDCharCount-1] of Byte;
    const
      GifBytes: GIFByteArray = ($47, $49, $46); // G I F
    var
      I: Integer;
      PrevPosition: Int64;
      ReadBytes: GIFByteArray;
    begin
      if (Stream = nil) or (Stream.Size < IDCharCount) then
        Exit(False);
    
      Result := True;
      PrevPosition := Stream.Position;
      try
        Stream.ReadBuffer(ReadBytes, IDCharCount);
        for I := Low(ReadBytes) to High(ReadBytes) do
          if ReadBytes[I] <> GifBytes[I] then
            Exit(False);
      finally
        Stream.Position := PrevPosition;
      end;
    end;

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 class helper, Firemonkey, Image url, TImage

    1. Blog Icon
      epilogs

      빌드해보니 아래와 같은 오류가 발생하네요.
      뭔가 설치를 추가로 해야하나보군요..^^

      [dcc32 Fatal Error] Unit3.pas(27): F1026 File not found: 'C:\Users\홍길동\Downloads\BitmapUrl\FMX.Devgear.Extentsions.dcu'

    2. 폼의 유닛에서 uses에서 오타가 있었습니다.
      다시 올렸구요. uses 절에 FMX.Devgear.Extensions;로 변경하시면 됩니다^^

    3. Blog Icon
      8비트24비트

      BitmapUrlDemo 소스로 테스트해본 결과

      안드로이드 환경에서는 가져오는 이미지가 8비트 형식일때 그림이 제대로 불러와지지 않네요
      ex) http://img.naver.net/static/www/u/2013/0731/nmms_224940510.gif

      24비트(jpeg)는 잘 보여지구요. (예제로 쓰인 그림도 이 경우더군요)

      윈도우에서는 잘만되니 모바일에서는 무언가 더 설정이 필요한건가요??

    4. 본문 하단의 내용을 참고하세요.

    Delphi XE5 and RAD Studio XE5 Android and iOS Code Samples

    2013.12.12 01:16

    안드로이와 iOS(아이폰)을 하나의 코드로 개발하는 RAD Studio XE5 모바일 샘플코드입니다.



    http://www.embarcadero.com/products/delphi/android-ios-code-samples-xe5


    다양한 샘플코드 및 구현영상(1분 내외)을 보실 수 있어요^^


    Device Sensors
    Accelerometer
    Gyroscope
    Location
    OrientationSensor
    Device Services
    DeviceInfo
    MessageAlerts
    Notifications (Send/Cancel)
    Notifications
      (Set Badge Number)

    PhoneDialer
    ShareSheet
    Touch/Gestures
    InteractiveGestures
    TabSliding

    Database Storage
    IBLite
    SQLite



    Native Controls
    CustomPicker
    DatePicker
    HorizontalScroll
    Media
    AccessCameraApp
    CameraComponent
    CameraRoll
    AudioRecPlay
    WebBrowser
    PlayAudioFile


    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 Firemonkey, XE5

    StyleBook Resources Text Editor 패치

    2013.12.05 13:32
    파이어몽키 스타일을 사용하면 매우 풍부하고 있어 보이게(?) 프로그램을 표현 할 수 있습니다.
    스타일 수정 시 약간의 편리한 기능의 패치가 있어 소개합니다.

    StyleBook Resources Text Editor

    내용 : Style designer로만 편집 가능했던 Resource를 Text Editor에서 수정 가능
    대상 : Delphi XE4 이상
    패치방법 : 
     1) 아래 링크에서 다운로드
     2) 다운받은 *.bpl파일을 특정 위치(라이브러리 등)로 이동
     3) Components > Install Package > Add > 위의 *.bpl 선택

    아래와 같이 Resource Property가 (Resource) > (TStrings)로 바뀌고 (TStrings) 더블클릭 시 String List Editor 윈도우가 호출 됩니다.(기존 (Resource) 더블 클릭 시 Style designer가 표시되었습니다.)
    패치 후 StyleBook 아이콘을 더블 클릭하면 Style designer로 넘어갈 수 있습니다.
    패치 이후 StyleBook Resource


    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 Firemonkey, StyleBook

    [FMX] 다이나믹한 UI 효과 - Float animation effect

    2013.03.05 16:35

    대부분의 분들은 파이어몽키로 멀티플랫폼 지원을 위한 개발을 생각하고 계실텐데요.

    파이어몽키는 멀티플랫폼 기능외에도 다양한 기능이 포함되어 있습니다.


    대표적으로 

    3D 효과 및 벡터형식의 부드러운 출력, RoateAngle 및 Scale 등의 신규 속성 등이 추가되었습니다.


    오늘은 

    새로운 기능 중 하나인 FloatAnimation에 대해 소개하려 합니다.


    FloatAnimation은 단어 그대로 Float을 Animation하는 놈입니다.


    좀 더 자세히 설명하면, 

    지정한 Start와 Stop에 해당하는 Float 값사이를 지정된 시간(Duration)에 맞춰 다양한 효과(Interpolation: 보간)로 값을 변경하는 놈입니다.


    우선 샘플을 보시면 아래의 영상은 마우스 휠(업/다운) 시 마우스 주변에 효과를 주고. 특정 Zoom 이상인 경우 RoundRect 메시지를 표시하고 서서히 사라지는 효과를 주었습니다.

    (구현 내용은 아래 첨부한 소스파일을 참고하시구요.)


    FloatAnimation은 TAniThread(FMX.Types.pas)에 의해 쓰래드로 진행이 되어 

    다른작업에 영향을 주지 않고도 UI에 다양한 효과 및 재미난 기능을 매우 쉽게 넣을 수 있습니다.


    FloatAnimation을 사용하는 방법은 두가지 인데요.


    첫째, 

    애니메이션 효과를 줄 컨트롤의 자식으로 TFloatAnimation을 등록 후 설정하여 사용하는 방법

    둘째,

    애니메이션 효과를 줄 컨트롤에 .AnimationFloat() 메소드를 이용하여 직접 효과를 주는 방법


    두개 중 편리한 방법을 사용하시면 될 것 같습니다.


    아래의 영상은

    AnimationType과 TInterpolationType을 지정하고 어떤 효과가 나는지 확인하는 샘플입니다.

    (당겼다가 가기[Back], 공튀기기[Bounce] 등의 효과를 확인 할 수 있습니다.)


    그리고 위 영상의 주요코드


    uses
      System.TypInfo;
    
    procedure TForm3.FormCreate(Sender: TObject);
    var
      Animation: TAnimationType;
      Interpolation: TInterpolationType;
    begin
      Circle1.Position.X := 0;
      Circle1.Position.Y := (Panel1.Height - Circle1.Height) / 2;
    
      // Circle이 멈출 위치를 계산
      FLastValue := Panel1.Width - Circle1.Width;
    
      // 콤보박스에 속성을 표시합니다.
      for Animation in [Low(TAnimationType)..High(TAnimationType)] do
        cbbAnimation.Items.AddObject(GetEnumName(TypeInfo(TAnimationType), Ord(Animation)), TObject(Animation));
      cbbAnimation.ItemIndex := 0;
    
      for Interpolation in [Low(TInterpolationType)..High(TInterpolationType)] do
        cbbInterpolation.Items.AddObject(GetEnumName(TypeInfo(TInterpolationType), Ord(Interpolation)), TObject(Interpolation));
      cbbInterpolation.ItemIndex := 0;
    end;
    
    procedure TForm3.Button1Click(Sender: TObject);
    begin
      if rbTFloatAnimation.IsChecked then
      begin
        FloatAnimation1.PropertyName := 'Position.X';
        FloatAnimation1.StartValue := 0;
        FloatAnimation1.StopValue := FLastValue;
        FloatAnimation1.Duration := 1;
        FloatAnimation1.AnimationType := TAnimationType(cbbAnimation.Items.Objects[cbbAnimation.ItemIndex]);
        FloatAnimation1.Interpolation := TInterpolationType(cbbInterpolation.Items.Objects[cbbInterpolation.ItemIndex]);
        FloatAnimation1.Start;
      end
      else
      begin
        Circle1.Position.X := 0;
        Circle1.AnimateFloat(
            'Position.X',
            FLastValue,
            1,
            TAnimationType(cbbAnimation.Items.Objects[cbbAnimation.ItemIndex]),
            TInterpolationType(cbbInterpolation.Items.Objects[cbbInterpolation.ItemIndex])
        );
      end;
    end;
    

    사용방법은 어렵지 않습니다.

    그래도 다양한 효과를 위해서는 TInterpolationType과 TAnimationType을 잘 설정해 주어야 합니다.

    글로 설명하는 것 보다 샘플프로그램 다운로드하셔서 실행해 보시는게 좋을 것같네요.


    샘플프로그램 실행파일 

    FloatAnimation.zip


    샘플프로그램 소스파일

    FloatAnimationSrc.zip


    경고창 애니메이션 효과 소스

    ThAlertAnimation.pas

    Zoom 애니메이션 효과 소스

    ThZoomAnimation.pas


    아래는 엠바카데로의 도움말입니다. 참고하세요.


    http://docwiki.embarcadero.com/Libraries/XE3/en/FMX.Types.TInterpolationType

    Value Meaning

    itLinear

    A linear interpolation. The property value this animation applies to changes constantly over time.

    itQuadratic

    A quadratic function is applied to the path between the start and stop points. The slope of the path is zero at the start point and increases constantly over time. A scalar is applied to the function to make the endpoint fall on the path.

    itCubic

    The interpolation is of the form y = x**3. The slope of the path is zero at the start point and increases much faster than the quadratic function over the path.

    itQuartic

    The interpolation is of the form y = x**4. The slope of the path is zero at the start point and increases much faster than the quadratic function over the path.

    itQuintic

    The interpolation is of the form y = x**5. The slope of the path is zero at the start point and increases much faster than the quadratic function over the path.

    itSinusoidal

    The interpolation is of the form y = sin(x). The slope of the path is zero at the start point and places the first inflexion of the sin curve (x=pi) at the stop point.

    itExponential

    The interpolation is of the form y = e**x. The slope of the path is one at the start point and increase much faster than the quadratic function over the path.

    itCircular

    The path between the start and stop point for this interpolation is a quarter of a circle. The slope of the path is zero at the start point and verticle at the stop point.

    itElastic

    The path does not follow a geometric interpolation. The value (y coordinate) may decrease, moving back toward the Start Value, but time (x value) must always move in a positive direction.

    itBack

    The path does not follow a geometric interpolation. The value (y coordinate) may decrease, moving back toward the Start Value, but time (x value) must always move in a positive direction.

    itBounce

    The path depicts a bouncing ball. The path is made up of circular curves with curvature away from the straight line that connects the start and stop points. These curves are connected by sharp points.


    http://docwiki.embarcadero.com/Libraries/XE3/en/FMX.Types.TAnimationType

    Value Meaning

    atIn

    The curve that applies to the TInterpolationType for this animation starts at the starting value of the property animated.

    atOut

    The curve that applies to the TInterpolationType for this animation starts at the ending value of the property animated and proceeds backwards to the starting value.

    atInOut

    The curve that applies to the TInterpolationType for this animation starts at both the starting value and the ending value of the property animated and meets at the center point.


    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 Animation Effect, AnimationFloat, Dynamic UI, Firemonkey, FloatAnimation, FMX, 파이어몽키

    메인폼을 얼리지 않고(Idle 상태) 대기하기.(TStopWatch 활용)

    2013.02.28 13:13

    볼랜드포럼에 Firemonkey 포럼이 생겨서 기분이 좋습니다. 룰루랄라 합니다.


    그래서 좋은 강좌를 남기고 싶은데 별로 아는게 없어서 쿨럭...

    그래서 팁이라도 남깁니다.


    이번에도 Unittest하며 필요해서 만들어 본것입니다.


    OpenDialog를 열고 파일경로를 입력해서 파일을 선택하는 Test 작성 중

    OpenDialog.execute하면 바로 열리지가 않죠?


    그래서 열릴때까지 대기를 해야 합니다.

    Sleep을 주었지요. 하지만 Sleep이 제어권을 놓지 않아 Sleep이 끝나고 창이 열립니다.


    그래서 좀 쉬며 기다리게 하려고 봤더니

    Firemonkey에서는 GetTickCount 등을 WinAPI를 사용하면 안되지요.

    그래서 찾은 놈이 StopWatch입니다.


    아래는 제어권을 갖지 않고 대기하는 코드입니다.


    uses
      System.Diagnostics;
    
    procedure TTestLib.Delay(ms: Integer);
    var
      StopWatch: TStopWatch;
    begin
      StopWatch := TStopWatch.Create;
    
      StopWatch.Start;
      repeat
        Application.ProcessMessages;
        Sleep(1);
      until StopWatch.ElapsedMilliseconds >= ms;
    end;
    


    감사합니다. 끝~

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키

    [FM2] XE3.FM2에서 Control을 Bitmap으로 내보내기 및 Bitmap.Pixels 사용하기

    2012.10.04 20:49

    Firemonkey2로 버전업 된 후로 참 많은 것이 변했습니다.


    TControl은 말할 것도 없고 TBitmap도 많은 내용이 변했네요.


    Unit test에서 특정 Pixel의 색상을 얻어오고자 할때 기존 Bitmap.Pixels이 없어진 것을 확인 후 깜짝 놀랐습니다.


    자... 그럼 제가 삽질로 얻어온 내용을 공유하도록 합니다.


    | Control을 Bitmap(TImage)으로 내보내기

    var
      Bitmap: TBitmap;
      Map: TBitmapData;
    begin
      Bitmap :=  TBitmap.Create(Round(Panel1.Width), Round(Panel1.Height));
      try
        Bitmap.Canvas.BeginScene;
    
        // Bitmap으로 내보내기
        Bitmap.Assign(Panel1.MakeScreenshot);
     
        // Pixel의 값을 원하실 때는 이렇게
        Bitmap.Map(TMapAccess.maRead, Map);
        //AlphaColor := Map.GetPixel(Round(X), Round(Y));
        Bitmap.Unmap(Map);
        Bitmap.Canvas.EndScene;
    
        Image1.Bitmap.Assign(Bitmap);
      finally
        Bitmap.Free;
      end;
    end;
    


    Panel1의 화면을 Bitmap으로 내보내는 코드 입니다.

    특정 좌표의 값은 Map.GetPixel로 얻어오실 수 있구요 반환은 TAlphaColor 입니다.


    TBitmapData라는 구조체를 이용하는군요 구글링에도 없는 따끈한 정보입니다. 실은 많이 안찾아 봣습니다. -_-;

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    험프리.김현수 파이어몽키 Bitmap.Pixels, Delphi, Fm2, FMX, TBitmapData, XE3, 태그를 입력해 주세요.

    [FMX] Firemonkey 구조 - 어떻게 하나의 코드로 여러 플랫폼에서 실행 될까?

    2012.06.23 03:04

    이번에는 이리저리 파이어몽키 소스 보며 익혔던 간단한 구조에 대해 설명하려 합니다.

    (딱, 제가 아는 만큼만 소개합니다.^^)


    파이어몽키는 멀티 플랫폼을 지원하는 델파이 프레임웤 입니다.

    어떻게 파이어몽키는 하나의 소스로 여러개의 플랫폼을 지원할까요?

    여러개의 플랫폼을 지원하는 열쇠는 FMX.Platform.pas의 Platform: TPlatform에 있습니다.
    (C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\source\fmx에 소스파일이 있습니다.)


    FMX.Platform의 TPlatform 클래스를 보시면 대부분(거의 다)이 추상메소드(virtual; abstract;) 입니다. 구현이 안되어 있다는 것이죠.

    그리고 메소드명이 상당히 플랫폼에 종속적인 냄새를 풍깁니다.

    CreateWindow(창을 생성하는 건 OS에서 해주겠죠.)
    CreateTimer(타이머도 OS에서 이벤트를 발생해 줍니다.)
    WaitMessage(메시지 처리도 OS와 연관이 있지요.) 등등 모두 플랫폼에 종족적인 메소드들입니다.

    그리고 소스 디렉토리에 보시면 FMX.Platform.Win과 FMX.Platform.Mac 두개의 플랫폼 관련 유닛파일을 보실 수 있습니다.

    즉, FMX.Platform의 TPlatform을 상속받은 클래스들이 구현되어 있겠죠.

    맞습니다. 각 파일을 보시면 TPlatformWin과 TPlatformCocoa 두개의 클래스가 TPlatform을 상속받습니다.

    물론 추상메소드들도 모두 구현되어 있습니다.

    TPlatformWin은 Windows API를 이용하여 구현이 되어 있고, TPlatformCocoa는 OS X API로 구현이 되어 있습니다.


    그럼 어떻게 Firemonkey는 플랫폼에 맞는 TPlatform 객체를 사용할까요?

    위의 질문에 답하기 위해 먼저 프로젝트 소스파일을 들여다 보겠습니다.

    Delphi XE2에서 <Firemonkey HD Application> 프로젝트를 생성하시면 아래와 같은 소스코드를 기본적으로 생성합니다.

    program Project1;
    
    uses
      FMX.Forms,
      Unit1 in 'Unit1.pas' {Form1};
    
    {$R *.res}
    
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    

    위의 프로젝트 소스를 보면 도무지 참조하는 유닛이 FMX.Forms 밖에 없습니다.


    그럼 FMX.Forms 유닛을 살펴보겠습니다.

    주욱 보시면 VCL에서도 익숙한 TApplication, 앞으로 친하게 지내야될 TCommonCustomForm 등등의 클래스 등이 보입니다.

    그리고 제일 아래에 보면 우리가 찾던 Platform 관련된 코드가 보입니다.

    initialization
      RegisterFmxClasses([TApplication], [TApplication]);
      Screen := TScreen.Create(nil);
      Platform := PlatformClass.Create(nil);
      System.Classes.RegisterFindGlobalComponentProc(FindGlobalComponent);
    
    finalization
      System.Classes.UnregisterFindGlobalComponentProc(FindGlobalComponent);
      FreeAndNil(Screen);
      // Platform global is freed in FMX.Types
    

    위 코드의 4번째 줄을 보시면

    Platform := PlatformClass.Create(nil);

    이라고 PlatformClass를 이용해 TPlatform 객체를 생성해 할당합니다.


    자 그럼 다시 PaltformClass를 따라가 봅니다.

    FMX.Platform.pas에 PlatformClass 함수가 구현되어 있습니다.

    function PlatformClass: TPlatformClass;
    begin
      Result := ActualPlatformClass;
    end;

    그럼 ActualPlatformClass는 어디에 구현되어 있을까요?


    예상하시는 분들도 있겠지만 위에서 설명한 Platform별 유닛(FMX.Platform.Win, FMX.Platform.Mac)에 구현되어 있습니다.

    MSWINDOWS의 경우 TPlatformWin을 반환하고

    MACOS의 경우 TPlatformCocoa를 반환합니다.

    근데 의문이 듭니다. 어떻게 델파이는 2개중에 하나를 선택할까요?

    그건 바로 Conditional define($IFDEF)을 이용합니다.

    FMX.Platform의 구현부(implementation) 시작을 보시면 아래와 같은 코드를 보실 수 있습니다.

    {$IFDEF IOS}
    uses
      FMX.Platform.iOS, FMX.Canvas.iOS, FMX.Context.GLES;
    {$ENDIF}
    
    {$IFDEF MACOS}
    uses
      FMX.Platform.Mac, FMX.Canvas.Mac, FMX.Context.Mac;
    {$ENDIF}
    
    {$IFDEF MSWINDOWS}
    uses
      FMX.Platform.Win, FMX.Context.DX9;
    {$ENDIF}
    
    

    보시면 아시겠지만 IOS, MACOS, MSWINDOWS 별로 다른 유닛을 참조하도록 되어있습니다.

    위의 3가지는 모두 Firemonkey가 지원하는 플랫폼입니다.

    즉 Project Manager의 Target platform에서 Platform을 선택하면 그에 맞는 값(IOS, MACOS, MSWINDOWS)이 내부적으로 정의됩니다.

    그래서 결국은 Target platform에 맞는 TPlatform 객체를 이용하여 OS에 맞는 API를 사용하여 실행됩니다.


    좀더 설명을 하자면 위의 프로젝트 소스를 보시면 아래와 같이 Application을 실행(RUN)하는 코드를 볼 수 있습니다.

    Application.Run;

    Run 메소드를 살펴보면 아래와 같이 Platform에 따른 코드를 사용하여 Application을 실행합니다.

    procedure TApplication.Run;
    begin
      FRunning := True;
      AddExitProc(DoneApplication);
      try
        Platform.Run; // Platform의 Run 실행
      finally
        FRunning := False;
      end;
    end;
    
    // MSWINDOWS에 맞게 Application 실행
    procedure TPlatformWin.Run;
    begin
      { checking for canvas }
      if GlobalUseDirect2D then
        SetD2DDefault;
    
      Application.RealCreateForms;
      repeat
        try
          Application.HandleMessage;
        except
          Application.HandleException(Self);
        end;
      until Application.Terminated;
    end;
    
    // MACOS 맞게 Application 실행
    procedure TPlatformCocoa.Run;
    begin
      Application.RealCreateForms;
      CreateApplicationMenu;
      FRunLoopObserver := CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopBeforeWaiting, True, 0, RunLoopObserverCallback, nil);
      CFRunLoopAddObserver(CFRunLoopGetCurrent, FRunLoopObserver, kCFRunLoopCommonModes);
      NSApp.Run;
    end;
    

    다른 메서드 또는 다른 유닛(FMX.Types 등)에서 Platform 전역변수를 이용하도록 구현되어 있습니다.


    다시한번 정리하면, 

    1, Project 소스에서 FMX.Forms 참조(uses)

    2, FMS.Forms의 Initialization에서 FMS.Platform.pas 유닛의 PlatformClass를 통해 Platform 생성

    3, FMS.Platform는 각 플랫폼 유닛의 ActualPlatformClass 함수 호출하여 Platform에 맞는 TPlatform 객체 형 방ㄴ환

    4, 단, Platform에 맞는 유닛을 $IFDEF를 이용하여 결정($IFDEF는 Target platform 선택 시 정의)


    이상으로 Firemonkey에서 Platform에 맞게 실행되는 구조를 두서없이 설명했습니다.

    감사합니다. 끝~


    PS - 다음에는 Firemonkey를 실질적으로 사용하기 위한 팁들을 몇개 소개하겠습니다.^^

    신고

    험프리.김현수 파이어몽키 Firemonkey, FMX, FMX 구조, multi platform