Android平台的标签云实现
概要
标签云(TagCloud)是用以表示一个网站中内容的标签集合。标签的排列顺序一般依照字典排序,或按照热门程度确定字体的大小和颜色。这样,依照字典或者热门程度来寻找信息便成为可能。标签通常是超链接,指向分类页面。一个典型的标签云实现如图所示:
上图为一个动态标签云的实现。鼠标放置在画面某处,则该处的标签会向画面中心移动并且逐渐变大,而其余标签则会按照同样的方向集体移动,但远离画面中心的标签将会逐渐变小。
设计目标
- 利用Android平台实现类似于Google搜索浑天仪的动态标签云效果
- 在一个屏幕上显示最多25个标签,这些标签均匀分布在屏幕各个位置。
- 在屏幕中心的标签字体最大,颜色RGB中红色权重大;离开中心越远的标签字体越小,颜色RGB中红色权重小。
- 划动触摸屏,所有标签沿划动方向旋转,并且保证不会移出屏幕。
- 划动屏幕的速度和幅度越大,标签移动速度越快。
- 在标签移动的过程中,会根据其所处位置动态更新其字体大小。
- 点击屏幕某处的标签,将切换到另一界面显示该标签内容(具体功能可另加)。
实现方案
1) 建立一个三维直角坐标系,以原点(0,0,0)为圆心,作一个半径为R的球面(R的大小需要根据屏幕大小来确定)。其中,Y轴和Z轴分别对应屏幕上的水平方向和垂直方向,X轴代表纵深方向,如下图所示:
2) 将所有标签分布在球面上,因此每个标签均有一个坐标(x,y,z)。
3) 根据标签的x坐标确定其字体大小。由于X轴表示纵深方向,因此x越大,则该标签离用户越近,字体就越大;反之,x越小,则该标签离用户越远,字体就越小。
4) 当划动屏幕时,所有标签以一定的速度和方向进行移动,该移动过程即表现为球面的旋转。需要确定的是球面旋转的角度和速度。其中,转动速度由划动屏幕的速度决定。划动速度越大,转动速度也越快。转动角度(即标签云整体移动方向)可由下述方法确定:假设划动屏幕的起始点和终止点分别为(0,y1,z1)和(0,y2,z2),在YOZ平面上,过圆心作向量(0,y2-y1,z2-z1)的垂直线L,将L作为球面旋转的转轴。空间上某点绕任意向量旋转的算法可由四元数运算来确定。
5) 将各个标签的坐标进行四元数运算即可获得球面旋转后各标签的新坐标(x’,y’,z’),按照新坐标对屏幕进行重绘,不断重复该过程即可实现标签云的动态变化。
几点说明
- 上述方案对原理进行了说明,具体到程序设计中,可通过Canvas和Paint实现标签绘制,并在程序运行过程中不断重绘和刷新屏幕实现标签位置和大小的变化。
- 该方案仅对动态标签云的实现进行阐述,各标签的内容为手动设定。实现时可以设计一个接口用于接收外部数据,便于与其他功能结合(例如搜索引擎)。