WP7下的LED模拟显示程序
对SilverLight与WPF不熟,连带着Windows Phone7的教程看了几天之后打算做一个模拟LED点阵文字显示的应用。功能很简单,就是让用户输入自定义文本,然后在一个40×24点阵的模拟LED显示屏上显示。
本来以为会很简单,但是实际开发过程中却发现WP7不支持GDI+(貌似从WPF开始就不支持了),如何将文字转换为点阵信息是个棘手的问题。SilverLight中有一个WriteableBitmap的类,可以对其进行像素操作,这下就有思路了,按照GDI+的方式在之上绘制自定义文字,调整为需要的分辨率,然后读取其中的像素,判断像素点的颜色,保存在一个矩阵数组中。
但是没有找到在WriteableBitmap中绘制文本的方法,倒是发现此类可以任意绘制SilverLight的图形控件,于是就预先把文字写在一个隐藏的TextBlock中,再将TextBlock绘制在WriteableBitmap上,使用Pixels方法获取其像素信息(返回值是个一维的数组)。然后迭代判断每个像素的颜色信息,显示在模拟的LED屏幕上,折腾了一天终于大概有了结果:
现在是直接构造函数中在Canvas上绘制了24×40个Ellipse,LED滚动的每一帧直接遍历修改每一个Ellipse的Fill属性就可以,在模拟器上测试发现效率还可以,也没有发生闪烁现象,不知道在真机上跑如何,如果不行的话就需要用到双缓冲了。
显示效果还可以,但是有几个问题:
WP7自带的中文字体貌似是雅黑,反正不是点阵字体,边缘像素为灰色的过渡色,如果分辨率太低或者字型复杂的话显示效果就不好了。
另外就是TextBlock控件上边缘和文字之间有很大的空间,得把这部分裁去,并且绘制的时候不知道用户输入的文本长度,没办法确定TextBlock的长度,以后LED滚动播放的时候没办法判断边界。
第二个问题,可以先判定用户输入文本长度,只要让TextBlock的长度大概大于这个长度就可以,然后再实现一个判断边界的方法,比较麻烦,将边缘没有像素的地方都去掉。
另外还有一个方法,程序附带一个点阵字体的字库,从字库中读出输入文字的点阵信息,显示在模拟LED上,正在尝试中,看看能不能实现。
请教一下园子里的大大,SilverLight还有什么好的方法绘制文本呢?
另外WP7的模拟器的确是赞啊,运行非常流畅,感觉像是直接在PC机上跑一个WP7的CLR。Android模拟器需要先跑一个Linux的虚拟机,再在虚拟机上跑Davilk,那个卡的啊我就不说了。