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