最近在做一个即时通信的软件,功能和界面上都模拟QQ、MSN等。相信这些软件用户交互界面可以获得较好的用户体验。软件的功能要强大,但是界面也同样重要。
网上查了一些资料,很多提问关于QQ好友上线头像闪动是怎样实现的?
前边说到是模拟,就是说我们还没有能力像qq那样自己编写控件,网上很多人讲了解决的方法。不过原理都是很相似的,仔细看一下qq接受到消息的时候。头像的跳动轨迹----左下-->中上-->右下-->中上 三个状态循环。中间的间隔时间大约在300~500ms.(大约估计的)。很多人讲可以用一个gif图片来替换。这个方法是很简单,虽软编成是简单了,可以那么多头像都要给它们做一个gif的副本?要是程序支持自定义头像,显然是走了弯路了。看看QQ文件夹下的NEWFAC文件夹,也是只有单个头像,没有GIF副本。虽然我们不知道QQ是怎样做到的(应该是自己写的控件,可能继承自TreeView之类的),那些就不关心了。既然要模仿的是效果看下面的截图
实现代码:
网上查了一些资料,很多提问关于QQ好友上线头像闪动是怎样实现的?
前边说到是模拟,就是说我们还没有能力像qq那样自己编写控件,网上很多人讲了解决的方法。不过原理都是很相似的,仔细看一下qq接受到消息的时候。头像的跳动轨迹----左下-->中上-->右下-->中上 三个状态循环。中间的间隔时间大约在300~500ms.(大约估计的)。很多人讲可以用一个gif图片来替换。这个方法是很简单,虽软编成是简单了,可以那么多头像都要给它们做一个gif的副本?要是程序支持自定义头像,显然是走了弯路了。看看QQ文件夹下的NEWFAC文件夹,也是只有单个头像,没有GIF副本。虽然我们不知道QQ是怎样做到的(应该是自己写的控件,可能继承自TreeView之类的),那些就不关心了。既然要模仿的是效果看下面的截图
实现代码:
1
private
void
creatNewImage()
2 {
3 Control.CheckForIllegalCrossThreadCalls = false ;
4 // 跨线程调用,.NET Framework 2.0会出现这个问题,可以在创建控件的基础句柄所在线程上异步执行指定委托
5 // 这里为了演示一下效果,所以没有采用那种方式
6 Bitmap bmp = new Bitmap( 22 , 20 ); // 大小视情况而定,不要影响到界面其他地方
7 Graphics gph;
8 // 从指定的Image对象创建新Graphics对象
9 gph = Graphics.FromImage(bmp);
10 Bitmap mybit = new Bitmap(buttonItem2.Image);
11 Bitmap bit2 = new Bitmap(buttonItem1.Image);
12 while ( true )
13 {
14 gph.Clear(Color.White);
15 gph.DrawImage(mybit, 0 , 1 , 20 , 20 );
16 buttonItem2.Image = bmp; // 接受到消息,头像跳动
17 buttonItem1.Image = mybit; // 这个是部门分组前边,好友头像的闪动提示
18 Thread.Sleep( 300 );
19
20 gph.Clear(Color.White);
21 gph.DrawImage(mybit, 1 , 0 , 20 , 20 );
22 buttonItem2.Image = bmp;
23 Thread.Sleep( 300 );
24
25 gph.Clear(Color.White);
26 gph.DrawImage(mybit, 2 , 1 , 20 , 20 );
27 buttonItem2.Image = bmp;
28 buttonItem1.Image = bit2;
29 Thread.Sleep( 300 );
30
31 gph.Clear(Color.White);
32 gph.DrawImage(mybit, 1 , 0 , 20 , 20 );
33 buttonItem2.Image = bmp;
34 Thread.Sleep( 300 );
35
36 }
2 {
3 Control.CheckForIllegalCrossThreadCalls = false ;
4 // 跨线程调用,.NET Framework 2.0会出现这个问题,可以在创建控件的基础句柄所在线程上异步执行指定委托
5 // 这里为了演示一下效果,所以没有采用那种方式
6 Bitmap bmp = new Bitmap( 22 , 20 ); // 大小视情况而定,不要影响到界面其他地方
7 Graphics gph;
8 // 从指定的Image对象创建新Graphics对象
9 gph = Graphics.FromImage(bmp);
10 Bitmap mybit = new Bitmap(buttonItem2.Image);
11 Bitmap bit2 = new Bitmap(buttonItem1.Image);
12 while ( true )
13 {
14 gph.Clear(Color.White);
15 gph.DrawImage(mybit, 0 , 1 , 20 , 20 );
16 buttonItem2.Image = bmp; // 接受到消息,头像跳动
17 buttonItem1.Image = mybit; // 这个是部门分组前边,好友头像的闪动提示
18 Thread.Sleep( 300 );
19
20 gph.Clear(Color.White);
21 gph.DrawImage(mybit, 1 , 0 , 20 , 20 );
22 buttonItem2.Image = bmp;
23 Thread.Sleep( 300 );
24
25 gph.Clear(Color.White);
26 gph.DrawImage(mybit, 2 , 1 , 20 , 20 );
27 buttonItem2.Image = bmp;
28 buttonItem1.Image = bit2;
29 Thread.Sleep( 300 );
30
31 gph.Clear(Color.White);
32 gph.DrawImage(mybit, 1 , 0 , 20 , 20 );
33 buttonItem2.Image = bmp;
34 Thread.Sleep( 300 );
35
36 }
通过在内存中的Bitmap的绘制(图像按照左下、中上、右下的方向平移绘制),然后按照时间间隔替换好友Item上的Image。可以达到QQ好友上线的头像跳动,然后在系统托盘上也显示类似的闪动。
当收到服务器转发过来的消息的时候启动一个以这个方法入口的线程,可以显示头像提示,当然加入滴、滴、滴的提示声音就更生动了。鼠标点击后,弹出聊天窗口。终止线程。为了实现头像闪动的效果,我是这样想的,如果各位还有好的方法,不妨交流一下。
我用的空间是DotNetBar中ItemPanel控件,实现分组的,折叠。因为准备做一个漂亮的界面效果。所以用了第三方的控件。估计vs2005中的TreeView也可以的。嘿嘿好友类表还是用tree好一点,不过在DotNetBar中没有找到那个控件。