在bibibi推出弹幕功能,我也爱上了边看视频边看吐槽了,现在让我们也来实现这一个功能吧。
首先我们要整理一下思绪我们大概需要实现哪个细节板块呢。
我们最直观的看来,弹幕就是总右往左出现到消失。我们要实现这个动画,弹幕的大小,颜色,出现方式,加速,弹幕的不重叠(这个我想了好久还没有实现,有实现方法可以联系下我)。
我们先来了解一下等会程序里面会用到的相关知识点,等会看代码会更轻松一点。
/*getHeight跟getMeasureHeight的区别
* 实际上在当屏幕可以包裹内容的时候,他们的值相等,只有当view超出屏幕后,才能看出他们的区别:
* getMeasuredHeight()是实际View的大小,与屏幕无关,而getHeight的大小此时则是屏幕的大小。
* 当超出屏幕后, getMeasuredHeight() 等于 getHeight()加上屏幕之外没有显示的大小
*
* */
/Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。
//当你屏幕的焦点发生变化时候,想要操作什么也完全可以在这个方法里面执行
// Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。
/*
* AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
* fillBefore是指动画结束时画面停留在此动画的第一帧;
fillAfter是指动画结束是画面停留在此动画的最后一帧。
Java代码设置如下:
/*****动画结束时,停留在最后一帧*********
setFillAfter(true);
setFillBefore(false);
/*****动画结束时,停留在第一帧*********
setFillAfter(false);
setFillBefore(true);
*
下面我们就来看一下弹幕实现的效果。
弹幕会出现重叠,这个问题还未解决
让我们开始看代码结构吧。
我们字体颜色的xml都写在了colors.xml中了,BarrageItem里面存放着我们的一些变量,而核心代码都在View中
BraagetItem.java
pac