前言
最近在学习开源弹幕引擎源码,其中对重绘的控制的很好,值得学习,我把一部分技术应用到我的这个动画里面。第一,在这个弹幕引擎里面,各个弹幕相互独立,独立计算独立绘制。第二,不过度绘制,这种情况是丢帧的反面。简单来说就是不要在16ms内绘制两次,因为当fps大于60之后,人眼就看不出差别来了。
效果图
改进
- 面向对象,让每个点自己计算显示位置,自己绘制
每个点的运动轨迹是一样的,只是启动时间,启动位置不同,而这些可以通过时间偏移、位置偏移实现。独立之后逻辑变的简单。 - 参照系的问题
所有的点都一直有一个平移速度 - 不再16ms内重绘两次
计算两次更新绘制参数之间的时间间隔,如果小于16ms则让工作线程休眠,得到间隔到了16ms再更新绘制参数。 - 上篇博客中的uiHander没有必要,用postInvalidate()即可
Demo
源码
public class LoadingView extends View {
/**
* The cy of every point is the same.
*/
private float cy;
/**
* The radius of every point is the same.
*/
private float radius;
/**
* Used in animation.
*/
private long startMillis = -1;
private long lastMills = -1;
/**
* Used to make translation more smooth
*/
private Interpolator enterInterpolator, exitInterpolator;
/**
* The moving velocity of the point which is not entering or exiting
*/
private float v;
/**
* The number of points
*/
private int pointNum;
private HandlerThread workerThread;
private Handler workerHandler;
private long enterDuration = 600;
private long moveDuration