最近发现了一个比较好玩的效果,android实现的LED点阵屏幕效果,挺有意思的,于是花了点时间实现了一下,这个用在演唱会上的粉丝当成牌子举是不是挺好的呢,或者是送给妹子?哈哈~
实现思路比较简单,主要是计算汉字对应的点阵矩阵,汉字通过GB2312编码,每个汉字对用两个byte来表示,而一个汉字被存储为点阵时,以16*16表示,需要16*16=256bit,也就是32byte,GB2312编码也是它在字库文件中的区码和位码,通过这两个值可以计算到这个汉字在字库文件中的相对位置,根据这个位置读取接下来的32位,就对应着这个汉字对应的字模信息,字模信息 其实就是一个byte数组,对于16*16的汉字,对应着长度为32的byte数组。
比如要在手机屏幕上显示两个“我”字,也就是上面的样子,其实对应一个矩阵,称之为点阵矩阵,在存储的时候就是需要保存一个点阵矩阵,如上图的样子,黑色点为true,空心点为false,这个点阵矩阵很容易根据每个汉字的字模信息局算出来,其实就是将字模信息中的每个byte处理一下它的每个bit。
比如“我”这个字,它的字模信息为
[4, -128, 14, -96, 120, -112, 8, -112, 8, -124, -1, -2, 8, -128, 8, -112, 10, -112, 12, 96, 24, 64, 104, -96, 9, 32, 10, 20, 40, 20, 16, 12,]
两个”我”得到就是
[4, -128, 14, -96, 120, -112, 8, -112, 8, -124, -1, -2, 8, -128, 8, -112, 10, -112, 12, 96, 24, 64, 104, -96, 9, 32, 10, 20, 40, 20, 16, 12,
4, -128, 14, -96, 120, -112, 8, -112, 8, -124, -1, -2, 8, -128, 8, -112, 10, -112, 12, 96, 24, 64, 104, -96, 9, 32, 10, 20, 40, 20, 16, 12]
接下来就是将其对应成下面的byte矩阵,当然,对于每个字节,我们保存它的位信息,即保存成boolean值。
0x04,0x80 | 0x04,0x80
0x0E,0xA0 | 0x0E,0xA0
0x78,0x90 | 0x78,0x90
0x08,0x90 | 0x08,0x90
0x08,0x84 | 0x08,0x84
0xFF,0xFE | 0xFF,0xFE
0x08,0x80 | 0x08,0x80
0x08,0x90 | 0x08,0x90
0x0A,0x90 | 0x0A,0x90
0x0C,0x60 | 0x0C,0x60
0x18,0x40 | 0x18,0x40
0x68,0xA0 | 0x68,0xA0
0x09,0x20 | 0x09,0x20
0x0A,0x14 | 0x0A,0x14
0x28,0x14 | 0x28,0x14
0x10,0x0C | 0x10,0x0C
在绘图时,最好还是用SurfaceView,因为滚动时,绘制任务较多,需要注意的几个参数
控件宽度w,高度h,s为点的半径,高度方向上的点的个数为num,于是
点的半径r=(h – (num + 1) * s ) / (2 * num)
第(i,j)个点的坐标为 { (s + r + (s + 2 * r) * j), (s + r + (s + 2 * r) * i)}
当画每个点的时候和点阵矩阵对比,如果对应位置在点阵矩阵中为true就画成实心点,否则为空心点。
如何让启动起来呢?其实也很简单,只需要定时的将这个点阵矩阵的列循环左右移动,然后重绘即可,移动的速度