Android App开发进阶与项目实战
上QQ阅读APP看书,第一时间看更新

3.3.4 利用估值器实现弹幕动画

如今上网看电影电视越发流行了,追剧的时候经常看到视频上方数行评论向左边飘去,犹如子弹那样飞快掠过,这些评论文字因此得名“弹幕”。弹幕评论由正在观看的网友们即兴发表,故而连绵不绝从画面右端不断涌现,直到漂至画面左端才隐没消失。

虽然弹幕效果可使用平移动画实现,但是平移动画比较单调,只能控制位移,不能控制速率、文字大小、文字颜色等要素。想同时操纵视图的多种属性要素时,需要采用属性动画加以实现。然而视图的位移大小由间距属性margin控制,该属性又分为上下左右四个方向,更要命的是,这几个间距属性并非视图View类的属性,而是布局参数LayoutParams的属性,意味着无法通过“margin***”这种形式来直接构造属性动画对象。为了动态调整间距属性这种非常规属性,就要引入估值器实时计算当前的属性值,再据此设置自定义控件的状态参数。以间距属性为例,它的动画步骤说明如下:

定义一个间距估值器,实现接口TypeEvaluator的evaluate方法,并在该方法中返回指定时间点的间距数值。

调用ValueAnimator类的ofObject方法,根据间距估值器、开始位置和结束位置构建属性动画对象。

调用属性动画对象的addUpdateListener方法设置刷新监听器,在监听器内部获取当前的间距数值,并调整视图此时的布局参数。

具体到编码实现上,需要自定义弹幕视图,其内部在垂直方向排列,每行放置一个相对布局。发表弹幕评论时,先随机挑选某行相对布局,在该布局右侧添加文本视图,再通过前述的间距动画向左渐次滑动。弹幕视图的定义代码如下:

(完整代码见animation\src\main\java\com\example\animation\widget\BarrageView.java)

然后在布局文件中添加BarrageView节点,且活动代码调用弹幕视图的addComment方法发表评论。运行并测试该App,数次点击“添加评论”按钮后,弹幕效果如图3-28所示;继续点击几次“添加评论”按钮,此时弹幕效果如图3-29所示,可见每条弹幕评论都在往左漂去。

图3-28 开始不久的弹幕效果

图3-29 持续漂移的弹幕效果