// AnimExample.hrh
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
enum TExampleMenuCommands
{
EExampleItem0 = 200,
EExampleItem1,
EExampleItem2
};
enum TExampleSubMenuCommands
{
ESprite = 400,
EBasic
};
#define ECidFileNameLabel 0x11c6
#define EAnimToDo0 0x1150
#define EAnimToDo1 0x1151
#define EAnimToDo2 0x1152
#define EAnimToDo3 0x1153
#define EAnimToDo4 0x1124
#define EAnimToDo5 0x1155
#define EAnimToDo6 0x1156
#define EAnimToDo7 0x1157
#define EAnimToDo8 0x1158
#define EAnimToDo9 0x1159
// Common view controls
#define ETimewCidToolLabel 0x1301
#define ETimewCidToolSpacer 0x1302
// AnimExample.h
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
#ifndef __ANIMEXAMPLE_H
#define __ANIMEXAMPLE_H
#include <coeccntx.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikapp.h>
#include <eikdoc.h>
#include <eikmenup.h>
#include <eikstart.h>
#include <eikon.hrh>
#include <gdi.h>
#include <SpriteAnimation.h>
#include <ICLAnimationDataProvider.h>
#include <BasicAnimation.h>
#include "AnimMover.h"
#include <AnimExample.rsg>
#include "AnimExample.hrh"
_LIT(KAnimExGuitarPlayer,"Z:\\resource\\apps\\AnimExample\\GuitarPlayer.gif");
_LIT( KAnimExSpriteLabel, "Sprite Animation" );
_LIT( KAnimExBasicLabel, "Basic Animation" );
const TInt KBasicOffset = 135;
const TInt KSpriteOffset = 25;
const TInt KspriteInterval = 10000; //Microseconds
const TInt KBasicInterval = 99999; //Microseconds
const TInt KAnimExBasicPositionX = 300;
const TInt KAnimExBasicPositionY = 100;
const TInt KAnimExSpritePositionX = 60;
const TInt KAnimExSpritePositionY = 70;
enum TAnimOperation
{
EAnimPause,
EAnimResume,
EAnimHold,
EAnimUnhold,
EAnimFreeze,
EAnimUnfreeze,
EAnimStart,
EAnimStop
};
class CAnimationApplication : public CEikApplication
{
private:
// Inherited from class CApaApplication
CApaDocument* CreateDocumentL();
TUid AppDllUid() const;
};
class CAnimationAppView : public CCoeControl
{
public:
static CAnimationAppView* NewL( const TRect& aRect );
CAnimationAppView();
~CAnimationAppView();
void ConstructL( const TRect& aRect );
void ProduceSpriteAnimL();
void ProduceBasicAnimL();
void MoveAnimsL();
void DoSpriteAnimOperationL( TAnimOperation aOperation );
void DoBasicAnimOperationL( TAnimOperation aOperation );
void ResetSpriteAnimAndMover();
void ResetBasicAnimAndMover();
CSpriteAnimation* iSpriteAnim;
CBasicAnimation* iBasicAnim;
private:
// From CCoeControl
void Draw(const TRect& /*aRect*/) const;
private:
HBufC* iAnimTestText;
CSpriteAnimMover* iSpriteAnimMover;
CBasicAnimMover* iBasicAnimMover;
};
class CAnimationAppUi : public CEikAppUi
{
public:
void ConstructL();
~CAnimationAppUi();
private:
// Inherited from class CEikAppUi
void HandleCommandL(TInt aCommand);
private:
CAnimationAppView* iAppView;
};
class CAnimationDocument : public CEikDocument
{
public:
static CAnimationDocument* NewL(CEikApplication& aApp);
CAnimationDocument(CEikApplication& aApp);
void ConstructL();
private:
// Inherited from CEikDocument
CEikAppUi* CreateAppUiL();
};
#endif
// AnimMover.h
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
#ifndef __ANIMMOVER_H__
#define __ANIMMOVER_H__
#include <e32std.h>
#include <SpriteAnimation.h>
#include <BasicAnimation.h>
#include <math.h>
const TInt KXDeflectionIncrement = 5;
const TInt KXDeflectionTerminalValue = 475;
const TInt KYDeflectionOffset = 125;
const TInt KYDeflectionMultiplier = 12;
const TInt KAnimExBasicInitPosX = 300;
const TInt KAnimExBasicInitPosY = 100;
const TInt KAnimExSpriteInitPosX = 60;
const TInt KAnimExSpriteInitPosY = 70;
// Basic Animation Mover
class CSpriteAnimMover : public CActive
{
public:
CSpriteAnimMover( TInt aPriority, TInt aMicroSeconds, CSpriteAnimation* aSpriteAnim );
~CSpriteAnimMover();
protected:
void DoCancel();
void RunL();
private:
RTimer iTimer;
TInt iMicroSeconds;
CSpriteAnimation* iSpriteAnim; // Caller owns.
TInt iX;
TInt iY;
};
// Sprite Animation Mover
class CBasicAnimMover : public CActive
{
public:
CBasicAnimMover( TInt aPriority, TInt aMicroSeconds, CBasicAnimation* aBasicAnim );
~CBasicAnimMover();
protected:
void DoCancel();
void RunL();
private:
RTimer iTimer;
TInt iMicroSeconds;
CBasicAnimation* iBasicAnim; // Caller owns.
TInt iX;
TInt iY;
};
#endif // __ANIMMOVER_H__
// Anim_AppUi.cpp
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
#include "AnimExample.h"
// Second phase constructor of the application UI class.
// It creates and owns a single view.
void CAnimationAppUi::ConstructL()
{
// Complete the UI framework's construction of the App UI.
BaseConstructL();
// Create the appview.
iAppView = CAnimationAppView::NewL(ClientRect());
}
// The application UI class owns one view, and is responsible
// for destroying it
CAnimationAppUi::~CAnimationAppUi()
{
delete iAppView;
}
// Called by the UI framework when a command has been issued.
void CAnimationAppUi::HandleCommandL(TInt aCommand)
{
CEikonEnv* eikEnv = CEikonEnv::Static();
switch (aCommand)
{
case EAnimToDo0:
iAppView->ResetSpriteAnimAndMover();
iAppView->ProduceSpriteAnimL();
break;
case EAnimToDo1:
iAppView->ResetBasicAnimAndMover();
iAppView->ProduceBasicAnimL();
break;
case EAnimToDo2:
iAppView->DoSpriteAnimOperationL( EAnimPause );
break;
case EAnimToDo3:
iAppView->DoSpriteAnimOperationL( EAnimResume );
break;
case EAnimToDo4:
iAppView->DoSpriteAnimOperationL( EAnimStop );
break;
case EAnimToDo5:
iAppView->MoveAnimsL();
break;
case EAnimToDo6:
iAppView->DoBasicAnimOperationL( EAnimPause );
break;
case EAnimToDo7:
iAppView->DoBasicAnimOperationL( EAnimResume );
break;
case EAnimToDo8:
iAppView->DoBasicAnimOperationL( EAnimStop );
break;
case EAnimToDo9:
case EEikCmdExit:
Exit();
break;
}
}
// Anim_AppView.cpp
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
#include "AnimExample.h"
CAnimationAppView::CAnimationAppView()
{
}
CAnimationAppView* CAnimationAppView::NewL(const TRect& aRect)
{
CAnimationAppView* self = new(ELeave) CAnimationAppView();
CleanupStack::PushL(self);
self->ConstructL(aRect);
CleanupStack::Pop();
return self;
}
CAnimationAppView::~CAnimationAppView()
{
delete iAnimTestText;
delete iSpriteAnim;
delete iBasicAnim;
if( iSpriteAnimMover )
{
iSpriteAnimMover->Cancel();
delete iSpriteAnimMover;
}
if( iBasicAnimMover )
{
iBasicAnimMover->Cancel();
delete iBasicAnimMover;
}
}
// Standard initialisation for a window-owning control.
void CAnimationAppView::ConstructL( const TRect& aRect )
{
// Fetch the text from the resource file.
iAnimTestText = iEikonEnv->AllocReadResourceL( R_EXAMPLE_TEXT_BASICANIM );
// The control is window-owning.
CreateWindowL();
// Extent of the control.
SetRect(aRect);
// The control is ready to draw, so notify the UI framework.
ActivateL();
}
void CAnimationAppView::ProduceSpriteAnimL()
{
//ResetAnimsAndMovers();
// Simple sprite animation
CICLAnimationDataProvider* spriteDataProvider = new (ELeave)CICLAnimationDataProvider;
CleanupStack::PushL( spriteDataProvider );
spriteDataProvider->SetFileL( iEikonEnv->FsSession(), KAnimExGuitarPlayer() );
CleanupStack::Pop( spriteDataProvider );
iSpriteAnim = CSpriteAnimation::NewL( spriteDataProvider,TPoint(KAnimExSpritePositionX, KAnimExSpritePositionY), iEikonEnv->WsSession(), Window() );
TAnimationConfig config;
config.iFlags = TAnimationConfig::ELoop;
config.iData = -1;
iSpriteAnim->Start( config );
}
void CAnimationAppView::ProduceBasicAnimL()
{
TAnimationConfig config;
config.iFlags = TAnimationConfig::ELoop;
config.iData = -1;
// The basic animation. Drawn in ::Draw()
CICLAnimationDataProvider* basicDataProvider = new (ELeave)CICLAnimationDataProvider;
CleanupStack::PushL( basicDataProvider );
basicDataProvider->SetFileL( iEikonEnv->FsSession(), KAnimExGuitarPlayer() );
CleanupStack::Pop( basicDataProvider );
iBasicAnim = CBasicAnimation::NewL( basicDataProvider,TPoint( KAnimExBasicPositionX, KAnimExBasicPositionY ), iEikonEnv->WsSession(), Window() );
iBasicAnim->Start( config );
}
// AO timer interval in microseconds.
const TInt KPositionInterval = 10000;
void CAnimationAppView::MoveAnimsL()
{
if( iSpriteAnimMover )
{
iSpriteAnimMover->Cancel();
delete iSpriteAnimMover;
iSpriteAnimMover = NULL;
}
iSpriteAnimMover = new (ELeave) CSpriteAnimMover( EPriorityNormal, KspriteInterval, iSpriteAnim );
if( iBasicAnimMover )
{
iBasicAnimMover->Cancel();
delete iBasicAnimMover;
iBasicAnimMover = NULL;
}
iBasicAnimMover = new (ELeave) CBasicAnimMover( EPriorityNormal, KBasicInterval, iBasicAnim );
}
void CAnimationAppView::DoSpriteAnimOperationL( TAnimOperation aOperation )
{
if( !iSpriteAnim )
{
iEikonEnv->InfoMsg( _L("Not Initialised") );
return;
}
switch( aOperation )
{
case EAnimPause:
iSpriteAnim->Pause();
break;
case EAnimResume:
iSpriteAnim->Resume();
break;
case EAnimStop:
iSpriteAnim->Stop();
break;
default:
break;
}
}
void CAnimationAppView::DoBasicAnimOperationL( TAnimOperation aOperation )
{
if( !iBasicAnim )
{
iEikonEnv->InfoMsg( _L("Not Initialised") );
return;
}
switch( aOperation )
{
case EAnimPause:
iBasicAnim->Pause();
break;
case EAnimResume:
iBasicAnim->Resume();
break;
case EAnimStop:
iBasicAnim->Stop();
break;
default:
break;
}
}
// Delete the current anims and movers, if instantiated.
// Redraw the window after deleting a CBasicAnimation and call Invalidate()
void CAnimationAppView::ResetSpriteAnimAndMover()
{
if( iSpriteAnimMover )
{
iSpriteAnimMover->Cancel();
delete iSpriteAnimMover;
iSpriteAnimMover = NULL;
}
if( iSpriteAnim )
{
iSpriteAnim->Stop();
delete iSpriteAnim;
iSpriteAnim = NULL;
}
}
void CAnimationAppView::ResetBasicAnimAndMover()
{
if( iBasicAnimMover )
{
iBasicAnimMover->Cancel();
delete iBasicAnimMover;
iBasicAnimMover = NULL;
}
if( iBasicAnim )
{
iBasicAnim->Stop();
delete iBasicAnim;
iBasicAnim = NULL;
Window().Invalidate();
}
}
//Draw the view
void CAnimationAppView::Draw(const TRect& /*aRect*/) const
{
// Window graphics context
CWindowGc& gc = SystemGc();
// Area in which we shall draw
TRect drawRect = Rect();
// Font used for drawing text
const CFont* fontUsed;
// Clear the screen
gc.Clear();
// Use the title font supplied by the UI
fontUsed = iEikonEnv->TitleFont();
gc.UseFont( fontUsed );
// Draw the text in the rectangle
TInt baselineOffset=( drawRect.Height() - fontUsed->HeightInPixels() );
gc.DrawText( *iAnimTestText,drawRect,0 + fontUsed->HeightInPixels(),CGraphicsContext::ECenter, 0 );
gc.DrawText( KAnimExBasicLabel, drawRect, baselineOffset - KBasicOffset, CGraphicsContext::ECenter, 0 );
// CBasicAnimations need to be drawn by us.
if( iBasicAnim )
{
iBasicAnim->Draw( gc );
}
gc.DrawText( KAnimExSpriteLabel, drawRect, baselineOffset - KSpriteOffset, CGraphicsContext::ELeft, 0 );
// Discard the font.
gc.DiscardFont();
}
// Anim_Document.cpp
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
#include "AnimExample.h"
CAnimationDocument::CAnimationDocument(CEikApplication& aApp)
: CEikDocument(aApp)
{}
// Called by the UI framework to construct
// the application UI class. Note that the app UI's
// ConstructL() is called by the UI framework.
CEikAppUi* CAnimationDocument::CreateAppUiL()
{
return new(ELeave) CAnimationAppUi;
}
// Anim_Application.cpp
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
#include "AnimExample.h"
const TUid KUidAnimation = { 0xE80000A5 };
// Called by the UI framework to get the application's UID
TUid CAnimationApplication::AppDllUid() const
{
return KUidAnimation;
}
// Called by the UI framework at application start-up to
// create an instance of the document class.
CApaDocument* CAnimationApplication::CreateDocumentL()
{
return new (ELeave) CAnimationDocument(*this);
}
// Anim_Main.cpp
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
#include "AnimExample.h"
// The entry point for the application code. It creates
// an instance of the CApaApplication derived
// class, CAnimationApplication.
//
static CApaApplication* NewApplication()
{
return new CAnimationApplication;
}
TInt E32Main()
{
return EikStart::RunApplication( NewApplication );
}
// BLD.INF
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
PRJ_MMPFILES
AnimExample.mmp
PRJ_EXPORTS
GuitarPlayer.gif \epoc32\RELEASE\WINSCW\UDEB\Z\Resource\Apps\AnimExample\GuitarPlayer.gif
// AnimExample.mmp
//
// Copyright ©) 2006 Symbian Software Ltd. All rights reserved.
//
epocstacksize 0x5000
TARGETPATH \sys\bin
TARGET AnimExample.exe
TARGETTYPE exe
UID 0x100039CE 0xE80000A5
VENDORID 0x70000001
SOURCEPATH .
SOURCE Anim_Main.cpp
SOURCE Anim_Application.cpp
SOURCE Anim_Document.cpp
SOURCE Anim_AppUi.cpp
SOURCE Anim_AppView.cpp
SOURCE AnimMover.cpp
USERINCLUDE .
SYSTEMINCLUDE \epoc32\include
SYSTEMINCLUDE \epoc32\include\techview
SYSTEMINCLUDE \epoc32\include\libc
LIBRARY euser.lib apparc.lib cone.lib eikcore.lib
LIBRARY eikdlg.lib eikcoctl.lib gdi.lib
LIBRARY eikctl.lib smlClient.lib bafl.lib charconv.lib
LIBRARY efsrv.lib estor.lib eikfile.lib
LIBRARY TechViewCtl.lib
LIBRARY animation.lib
LIBRARY ws32.lib
START RESOURCE AnimExample.rss
HEADER
TARGETPATH \resource\apps
END
START RESOURCE AnimExample_reg.rss
TARGETPATH \private\10003a3f\apps
END
START BITMAP AnimExample_icon.mbm
HEADER
TARGETPATH \resource\apps
SOURCE c8 AnimExample_24.BMP AnimExample_2M.BMP
SOURCE c8 AnimExample_32.BMP AnimExample_3M.BMP
SOURCE c8 AnimExample_48.BMP AnimExample_4M.BMP
END
This example is a UI application, which demonstrates how to create and play basic and sprite animations. It implements all the standard classes required by any application using UI controls such as an application, a document, an application UI and a view.
The application provides UI controls to create a sprite animation and a basic client-side animation. It also provides UI controls to control the behaviour of an animation such as, start, stop, pause, resume and move.
The application plays an animated .gif
file both as a
basic client-side animation and a server-side sprite animation. It performs the
following tasks in the order they are listed to create the basic and sprite
animations:
Creates an object of the
CICLAnimationDataProvider
class.
Loads the animated .gif
file into the object.
Configures the animation to play in an infinite loop using
TAnimationConfig
.
Creates objects of CBasicAnimation
and
CSpriteAnimation
classes by passing the data provider
object as an argument.
Starts animations with the TAnimationConfig
object as an argument.
Once both the animations are started, the window server will
automatically draw the animations onto the window by calling the
Draw()
method.
The Symbian OS build process describes how to build an application. But, use abld
export
command before abld build
to copy the animated
.gif
file to RAM (C:\
drive) of the target platform.
The AnimExample builds an executable called AnimExample.exe
in the standard location
(\epoc32\release\winscw\
<build_variant> for
CodeWarrior). Either launch the executable or launch the emulator and then
select the AnimExample application from the Emulator's extras bar.