技术开发 频道

Symbian开发中滚动广告效果的制作方法

  【IT168技术】之前曾经有过制作屏幕滚动广告效果的需求,现在将制作的方法和大家分享一下,有需要的同志可以借鉴,以便之后开发出更加适合自己需求的滚动广告效果。本人将其制作成了一个控件,可以在屏幕需要的任何位置进行摆放,可操作性强,希望能对大家有帮助。

  先介绍一下头文件的部分,如下:

  1class CScrollLabel : public CEikLabel // 公共继承自CEikLabel类

  2{

  3public:

  4 CScrollLabel(); // 构造函数

  5 ~CScrollLabel();// 析构函数

  6Public:

  7 void Draw(const TRect& aRect) const; //重写绘图函数

  8 void SetTextL(const TDesC& aText); //重写CEikLabel的文本设置函数

  9 void Start(); //用于启动滚动的方法

  10 void SetBackgroundColor(TRgb aColor); //用于设置滚动广告控件的背景颜色

  11 void SetExtent(const TPoint &aPosition, const TSize &aSize); // 设置摆放的区域和控件本身的大小

  12private:

  13 //定时器回调函数,他是一个静态的函数,参数是一个函数指针,

  14 static TInt Tick(TAny* p);

  15 void DoScroll(); //滚动文本动作的执行函数

  16 TBool IsNeedScroll(); //判断滚动是否完成,返回值是一个TBool 类型

  17private:

  18 HBufC* iText; //保存要显示的文本,不知道具体的文本大小,选用HbufC描述符

  19 TPoint iStarPoint; // 起始位置的属性值,标注起始位置

  20 TSize iLabelSize; // 控件本身的大小

  21 CPeriodic* iPeriodicTimer; //定时器类,指定循环播放的周期

  22 TRgb iBackgroundColor; //背景颜色的属性值,可以手动进行设置

  23};

  24

  接着介绍CPP文件部分,头文件函数的实现部分,如下:

  1#include "ScrollLabel.h"

  2#include

  3#define SCROLL_INTERVAL 100000 // 定义滚动的时间间隔常量为100毫秒

  4

  5CScrollLabel::CScrollLabel() :iBackgroundColor(KRgbWhite)

  6 {

  7 }

  8CScrollLabel::~CScrollLabel()

  9 {

  10 if (iText)

  11 {

  12 delete iText;

  13 iText = NULL;

  14 }

  15 iPeriodicTimer->Cancel();// 由于Cperiodic 继承自CActive本身就是一个活动对象,因此在析构时要调用他的Cancel()方法,发送取消请求

  16 if (iPeriodicTimer)

  17 {

  18 delete iPeriodicTimer;

  19 iPeriodicTimer = NULL;

  20 }

  21 }

  22//用于设置文本内容函数的实现,对基类设置函数的封装

  23void CScrollLabel::SetTextL(const TDesC& aText)

  24 {

  25 if (iText)

  26 {

  27 delete iText;

  28 iText = NULL;

  29 }

  30 iText = aText.AllocL(); // 使用HbufC 本身的AllocL()方法完成内存空间的申请和内容的拷贝工作。

  31 CEikLabel::SetTextL(*iText); // 调用基类的设置方法

  32 }

  33//判断是否要实现文本滚动

  34TBool CScrollLabel::IsNeedScroll()

  35 {

  36 if (iText==NULL)

  37 return EFalse;// 如果没有文本就无需滚动

  38 if (iStarPoint.iX > -iLabelSize.iWidth) // 声明:是从右侧开始滚动

  39 return ETrue;

  40 return EFalse; // 默认是不需要滚动的

  41 }

  42

  43void CScrollLabel::Start() // 启动滚动的函数,

  44 {

  45 if (iPeriodicTimer==NULL && IsNeedScroll()) // 判断启动的条件

  46 {

  47 iPeriodicTimer = CPeriodic::NewL(EPriorityNormal); // 构造定时器对象

  48 iPeriodicTimer->Start(0, SCROLL_INTERVAL, TCallBack(Tick, this));// 第一个参数是0表示直接调用回调函数TcallBack(),第二个参数是两次回调函数之间的时间间隔

  49 }

  50 }

  51

  52TInt CScrollLabel::Tick(TAny* p)// 静态的函数,参数是任意类型的指针,可以进行强制类型转化

  53 {

  54 CScrollLabel* pThis = (CScrollLabel*)p; // 将p 强制类型转化成 CScrollLabel*

  55 pThis->DoScroll(); // 调用执行滚动的函数

  56 return 0; // 执行成功返回0

  57 }

  58

  59void CScrollLabel::DoScroll()

  60 {

  61 if (IsNeedScroll()) //如果具备播放的条件

  62 {

  63 iStarPoint.iX -= 5; // 由于从屏幕的右侧开始播放的,因此每次要减小5的步长

  64 }

  65 else

  66 {

  67 iStarPoint.iX = Rect().Size().iWidth; //重置为原来的位置

  68 }

  69 CEikLabel::SetExtent(iStarPoint, iLabelSize);// 设置操作

  70 DrawDeferred(); // 执行了每个动作要重绘一次,通常不用 DrawNow(),避免重绘是的闪屏,特别是在进行游戏或地图制作时,还会涉及到双缓冲的操作

  71 }

  72

  73void CScrollLabel::Draw(const TRect& aRect) const //绘制控件背景封装系统的Draw()函数

  74 {

  75 CEikLabel::Draw(aRect);

  76 }

  77

  78void CScrollLabel::SetBackgroundColor(TRgb aColor)

  79 {

  80 iBackgroundColor = aColor;

  81 }

  82

  83void CScrollLabel::SetExtent(const TPoint &aPosition, const TSize &aSize)

  84 {

  85 iStarPoint = aPosition;

  86 iLabelSize = aSize;

  87 iLabelSize.iWidth += 5; //每次向前滚动的长度,也就是步长,当然可以定义一个宏。

  88 CEikLabel::SetExtent(iStarPoint, iLabelSize);

  89 }

  90

  以上就是关于滚动广告控件的制作方法,以后就不必再为这个小东西的制作发愁啦,相信大家能把他放在屏幕符合需求的位置吧。建议大家把自己经常用到的控件整理成库,方便自己以后使用,其实工作效率的提高无非就是积累的可以使用的资源多,使用起来方便顺手,就像一个个小零件已经具备了,只剩下组装了。

0
相关文章