【IT168技术】之前曾经有过制作屏幕滚动广告效果的需求,现在将制作的方法和大家分享一下,有需要的同志可以借鉴,以便之后开发出更加适合自己需求的滚动广告效果。本人将其制作成了一个控件,可以在屏幕需要的任何位置进行摆放,可操作性强,希望能对大家有帮助。
先介绍一下头文件的部分,如下:
1
class CScrollLabel : public CEikLabel // 公共继承自CEikLabel类
2
{
3
public:
4
CScrollLabel(); // 构造函数
5
~CScrollLabel();// 析构函数
6
Public:
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); // 设置摆放的区域和控件本身的大小
12
private:
13
//定时器回调函数,他是一个静态的函数,参数是一个函数指针,
14
static TInt Tick(TAny* p);
15
void DoScroll(); //滚动文本动作的执行函数
16
TBool IsNeedScroll(); //判断滚动是否完成,返回值是一个TBool 类型
17
private:
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![]()
5
CScrollLabel::CScrollLabel() :iBackgroundColor(KRgbWhite)
6
{
7
}
8
CScrollLabel::~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
//用于设置文本内容函数的实现,对基类设置函数的封装
23
void 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
//判断是否要实现文本滚动
34
TBool CScrollLabel::IsNeedScroll()
35
{
36
if (iText==NULL)
37
return EFalse;// 如果没有文本就无需滚动
38
if (iStarPoint.iX > -iLabelSize.iWidth) // 声明:是从右侧开始滚动
39
return ETrue;
40
return EFalse; // 默认是不需要滚动的
41
}
42![]()
43
void 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![]()
52
TInt CScrollLabel::Tick(TAny* p)// 静态的函数,参数是任意类型的指针,可以进行强制类型转化
53
{
54
CScrollLabel* pThis = (CScrollLabel*)p; // 将p 强制类型转化成 CScrollLabel*
55
pThis->DoScroll(); // 调用执行滚动的函数
56
return 0; // 执行成功返回0
57
}
58![]()
59
void 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![]()
73
void CScrollLabel::Draw(const TRect& aRect) const //绘制控件背景封装系统的Draw()函数
74
{
75
CEikLabel::Draw(aRect);
76
}
77![]()
78
void CScrollLabel::SetBackgroundColor(TRgb aColor)
79
{
80
iBackgroundColor = aColor;
81
}
82![]()
83
void 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![]()
以上就是关于滚动广告控件的制作方法,以后就不必再为这个小东西的制作发愁啦,相信大家能把他放在屏幕符合需求的位置吧。建议大家把自己经常用到的控件整理成库,方便自己以后使用,其实工作效率的提高无非就是积累的可以使用的资源多,使用起来方便顺手,就像一个个小零件已经具备了,只剩下组装了。