log080825

来源:互联网 发布:为什么电脑打不开淘宝 编辑:程序博客网 时间:2024/05/18 02:24
TimeSlider: 设计一个滑动条,控制视频的时间轴,类似于mediaplayer中的搜索栏。
要求:1、只能有一个类。
      2、cpu占用率在20%以下。

根据外观TimeSlider分为Ruler,Track,Knob和Tip几个部分。用户可以在track上拖动Knob,Knob会在track上沿着Ruler的标度移动;Knob移动时,Tip会显示当前的标度数;用户松开鼠标时,Knob停止移动,并且产生一个CHANGE事件。

我先将Ruler,Track,Knob,Tip和TimeSlider写到了各自的实现类中,实现之后再将他们的代码拷贝到一起。
类Ruler接受TimeSlider的length和maxValue参数,画出刻度尺,在每隔1/5个maxValue的地方标出度数。
类Track接受TimeSlider的length参数,画出长度为length高度为1的长条。
类Tip提供ShowTip方法,他判断Knob是否已经被按下,如果是,则显示当前读数,否则隐藏。
类Knob提供MouseDown,MouseMove,MouseUp事件监听函数。MouseDown注册MouseMove和MouseUp为全局监听函数。MouseMove取得鼠标x坐标位置,将他换算为标度value,再设置Knob的x坐标值为与这个value对应的x坐标值。MouseUp卸载MouseMove和MouseUp监听函数。
类TimeSlider包含以上4个类,并且包含其他他们需要的数据:
length:TimeSlider在舞台上的长度,单位像素。
maxValue:TimeSlider能设置的最大值。
value:TimeSlider的当前值,Knob指示的值。
steplen:单位标度的像素数。
假设length固定。在修改maxValue时,需要重画Ruler和设置steplen,考虑设置后的maxValue可能小于value,需要重新设置value值。
在value被改变后,需要调整Knob的位置。
完成各类后,再将数据和代码复制到一个类中,为防止命名冲突,给每个类的成员数据和方法加上前缀。

完成后测试发现这个TimeSlider效率很低,cpu利用率随时间的流逝而增加,刚开始的20秒在20一下,但是1-2分钟后只要一拖动Knob,CPU会攀升到80以上。原因可能是由于Knob的MouseMove产生过多,还有RollIn和RollOut事件引发的重汇过多造成。解决方法是放弃处理MouseMove、RollIn和RollOut。处理Knob移动的方式改为:在Knob的MouseDown函数中开始一个计时器,设置为50毫秒触发一次;然后在他相应的TimerEvent函数中进行捕获鼠标位置等与MouseMove中相同的操作。这样每秒只需处理20个消息,而且免去了Knob的重画,CPU使用率在10%以下。

原创粉丝点击