![Android App开发进阶与项目实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/109/44510109/b_44510109.jpg)
3.3.4 利用估值器实现弹幕动画
如今上网看电影电视越发流行了,追剧的时候经常看到视频上方数行评论向左边飘去,犹如子弹那样飞快掠过,这些评论文字因此得名“弹幕”。弹幕评论由正在观看的网友们即兴发表,故而连绵不绝从画面右端不断涌现,直到漂至画面左端才隐没消失。
虽然弹幕效果可使用平移动画实现,但是平移动画比较单调,只能控制位移,不能控制速率、文字大小、文字颜色等要素。想同时操纵视图的多种属性要素时,需要采用属性动画加以实现。然而视图的位移大小由间距属性margin控制,该属性又分为上下左右四个方向,更要命的是,这几个间距属性并非视图View类的属性,而是布局参数LayoutParams的属性,意味着无法通过“margin***”这种形式来直接构造属性动画对象。为了动态调整间距属性这种非常规属性,就要引入估值器实时计算当前的属性值,再据此设置自定义控件的状态参数。以间距属性为例,它的动画步骤说明如下:
定义一个间距估值器,实现接口TypeEvaluator的evaluate方法,并在该方法中返回指定时间点的间距数值。
调用ValueAnimator类的ofObject方法,根据间距估值器、开始位置和结束位置构建属性动画对象。
调用属性动画对象的addUpdateListener方法设置刷新监听器,在监听器内部获取当前的间距数值,并调整视图此时的布局参数。
具体到编码实现上,需要自定义弹幕视图,其内部在垂直方向排列,每行放置一个相对布局。发表弹幕评论时,先随机挑选某行相对布局,在该布局右侧添加文本视图,再通过前述的间距动画向左渐次滑动。弹幕视图的定义代码如下:
(完整代码见animation\src\main\java\com\example\animation\widget\BarrageView.java)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P104_17395.jpg?sign=1739516387-y7bRb3Prji72f4sqXk5BeFQNn4Erzypi-0-57a5c7248f0805b49fc0e572e083ee5e)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P105_7782.jpg?sign=1739516387-qlNCF7R7yQ0kazv99RhRkHsTIanOXiEe-0-d5ef2c3cffedfafb64e1cec1acaf93cf)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P106_17396.jpg?sign=1739516387-A3fyWb9d23kJ1x619MIrh0cxNbMZuPPC-0-c4dfca0cf69896006b0ba6b4fc5f3e77)
然后在布局文件中添加BarrageView节点,且活动代码调用弹幕视图的addComment方法发表评论。运行并测试该App,数次点击“添加评论”按钮后,弹幕效果如图3-28所示;继续点击几次“添加评论”按钮,此时弹幕效果如图3-29所示,可见每条弹幕评论都在往左漂去。
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P106_7789.jpg?sign=1739516387-8thHcAsvCH2nNCSlxg32ZUA2zT5USIi7-0-a785793114484fc179793d556008f3de)
图3-28 开始不久的弹幕效果
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P106_7790.jpg?sign=1739516387-XWTJgfAxSqMKTIVFju54klCtRTiSk1Ji-0-8bde7776a179fde13e8312b3d4181d19)
图3-29 持续漂移的弹幕效果