Leonids 粒子系统源码分析
2017-05-17 18:15
435 查看
https://github.com/plattysoft/Leonids
用第一例子oneshot为例子:
public void onClick(View arg0) {
new ParticleSystem(this, 2, R.drawable.star_pink, 3200)
.setSpeedRange(0.1f, 0.25f) // 速度在这个两值之间,随机取。是角速度啊。
.oneShot(arg0, 2); // arg0为了获得,button的坐标。这个坐标为开始点。
}
所有点都画在ParticleField上了,这是一个view。
mActiveParticles 存放所有点的坐标信息,速度。。。
ValueAnimator是动画产生的原理,每隔一帧时间,会触发事件。这个事件定义成,改变所有的坐标值,重绘ParticleField。
private void onUpdate(long miliseconds) {
while (((mEmitingTime > 0 && miliseconds < mEmitingTime)|| mEmitingTime == -1) && // This point should emit
!mParticles.isEmpty() && // We have particles in the pool
mActivatedParticles < mParticlesPerMilisecond*miliseconds) { // and we are under the number of particles that should be launched
// Activate a new particle
activateParticle(miliseconds);
Log.e(TAG,"activateParticle");
}
synchronized(mActiveParticles) {
for (int i = 0; i < mActiveParticles.size(); i++) {
Log.e(TAG,"mActiveParticles i:"+i);
boolean active = mActiveParticles.get(i).update(miliseconds);//更新坐标
if (!active) {
Particle p = mActiveParticles.remove(i);
i--; // Needed to keep the index at the right position
mParticles.add(p);
}
}
}
mDrawingView.postInvalidate();
}
第二个例子,加速度掉下来。要手工计算 x=v0t+1/2*at^2
用第一例子oneshot为例子:
public void onClick(View arg0) {
new ParticleSystem(this, 2, R.drawable.star_pink, 3200)
.setSpeedRange(0.1f, 0.25f) // 速度在这个两值之间,随机取。是角速度啊。
.oneShot(arg0, 2); // arg0为了获得,button的坐标。这个坐标为开始点。
}
所有点都画在ParticleField上了,这是一个view。
mActiveParticles 存放所有点的坐标信息,速度。。。
ValueAnimator是动画产生的原理,每隔一帧时间,会触发事件。这个事件定义成,改变所有的坐标值,重绘ParticleField。
private void onUpdate(long miliseconds) {
while (((mEmitingTime > 0 && miliseconds < mEmitingTime)|| mEmitingTime == -1) && // This point should emit
!mParticles.isEmpty() && // We have particles in the pool
mActivatedParticles < mParticlesPerMilisecond*miliseconds) { // and we are under the number of particles that should be launched
// Activate a new particle
activateParticle(miliseconds);
Log.e(TAG,"activateParticle");
}
synchronized(mActiveParticles) {
for (int i = 0; i < mActiveParticles.size(); i++) {
Log.e(TAG,"mActiveParticles i:"+i);
boolean active = mActiveParticles.get(i).update(miliseconds);//更新坐标
if (!active) {
Particle p = mActiveParticles.remove(i);
i--; // Needed to keep the index at the right position
mParticles.add(p);
}
}
}
mDrawingView.postInvalidate();
}
private void startAnimator(Interpolator interpolator, long animnationTime) { mAnimator = ValueAnimator.ofInt(0, (int) animnationTime); mAnimator.setDuration(animnationTime); mAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int miliseconds = (Integer) animation.getAnimatedValue(); onUpdate(miliseconds); } }); mAnimator.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) {} @Override public void onAnimationRepeat(Animator animation) {} @Override public void onAnimationEnd(Animator animation) { cleanupAnimation(); } @Override public void onAnimationCancel(Animator animation) { cleanupAnimation(); } }); mAnimator.setInterpolator(interpolator); mAnimator.start(); }
第二个例子,加速度掉下来。要手工计算 x=v0t+1/2*at^2
mCurrentX = mInitialX+mSpeedX*realMiliseconds+mAccelerationX*realMiliseconds*realMiliseconds;
相关文章推荐
- Android日志系统第三方库------Logger 源码分析
- Android屏幕截图实现方式 & 系统截屏源码分析和三指截屏
- Linux内核源码分析之文件系统(1) -- 三思而后行
- linux内存源码分析 - 伙伴系统(初始化和申请页框)
- 第二人生的源码分析(四十三)虚拟文件系统线程
- Lighttpd1.4.20源码分析之fdevent系统(4) -----连接socket的处理与超时处理
- Cocos2d-x2.0 粒子系统深入分析三部曲(一)
- OpenGL学习笔记-2015.3.24——transform feedback缓存&粒子系统示例分析
- Android系统默认Home应用程序(Launcher)的启动过程源码分析
- linux内核mount系统调用源码分析
- Android 5.0 Camera系统源码分析(5):Camera预览3A流程
- jQuery-1.9.1源码分析系列(十) 事件系统——事件包装
- 性能最高的javascript 发布订阅系统(pub/sub)Arbiter.js 源码分析
- Elasticsearch源码分析之一——使用Guice进行依赖注入与模块化系统
- linux-kernel 3.5.3Tcp系统调用,源码分析4-inet_init
- tokyo tyrant源码分析-日志系统实现
- (源码分析)Android系统时间-自动获取
- 【源码分析】Android系统启动流程.
- [置顶] android源码4.4.2----系统启动过程分析
- Android Camera 系统架构源码分析(4)---->Camera的数据来源及Camera的管理