对于比较长的文本,滚动展示是一个常用的方法。
最近需要用到文本滚动展示,网上找了一下,csdn里面提到的有,但是已经收费了,所以干脆自己实现一个。
对于duilib来讲,滚动展示通常有两种实现思路:1.容器(HorizontalLayout或者VerticalLayout)内放Label,通过定时器去移动label的位置来实现。2.自己派生新控件,在新控件里面起定时器,然后在painttext里面去自绘。
对于文本滚动控件比较少的界面,第一种完全可以满足,也无需派生新控件,更为简单。对于可能有比较多的文本滚动控件需求的界面(比如列表或者九宫格布局之类的子控件),第一种管理起来稍有不便,不如直接派生新控件,每个控件自己管理自己的滚动。
这里给出第二种实现的大致思路以及源码:
1.从label派生,增加设置步进间隔,步进像素,步进方向的属性和方法。
2.增加构建文本位图的方法,将所需文本根据控件宽高,textpadding,多行,字号等属性,预先绘制成一个位图,选入到兼容DC里面。
3.重载painttext函数,当需要painttext时,将文本位图的指定区域alphablend到窗口DC的指定区域,每次计算好这个区域,以此来实现滚动展示的效果。
4.根据需要,在settext等方法中启动定时器以便于触发滚动刷新。
具体实现代码在https://github.com/juhuaguai/duilib/blob/master/DuiLib/Control/UIScrollLabel.cpp ,这里的CScrollLabelUI控件就是文本滚动展示控件,设置滚动间隔,每次滚动像素,滚动方向(横向滚动(根据步进值支持向左或向右设置),垂直滚动(根据步进值支持向上或向下设置))