这里写自定义目录标题
android基础-开发一个动画效果框架
本框架是借用facebook的弹性框架修改而来,如有侵权请告知.当然这也不是个成熟的框架,还在优化中.
框架结构
这里其实很简单.说简单了就是一个looper循环一直作用在一个算法上,让后这个算法一直输出值.可将这个值作用于android的动画.
使用方法
如果你想做个动画 如弹性动画 (我们以AE的万能弹性动画为例)公式如下,UI用下面的公式做了个弹性动画.你想把它搬到android中.
amp = .1;
freq = 2.0;
decay = 2.0;
n = 0;
if (numKeys > 0)
{
n = nearestKey(time).index;
if (key(n).time > time) {n--;}
}
if (n == 0)
{
t = 0;
} else {
t = time - key(n).time;
}
if (n > 0)
{
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
} else{ value }
- 1 写个类(OverShoot)继承Elasticity接口.接口中有一下方法.
public double getValue(); //算法输出的值
public String getId();//后续需要做连锁动画的id
public boolean systemShouldAdvance();//算法停止条件
public void advance(double d);//主要算法
public Elasticity addListener(ElasticityListener newListener);//输出监听 public Elasticity removeListener(ElasticityListener listenerToRemove);//移除监听
这里贴出主要的算法函数.
public void advance(double realDeltaTime)
{
...
double value = v * amp * Math.sin(freq * 2 * T * Math.PI) / Math.exp(decay * T);
...
for (ElasticityListener listener : mListeners)
{
if (notifyActivate) {
listener.onSpringActivate(this);
}
listener.onSpringUpdate(this);
if (notifyAtRest) {
listener.onSpringAtRest(this);
}
}
}
这样这算法就完成了.double value = v * amp * Math.sin(freq * 2 * T * Math.PI) / Math.exp(decay * T);
系统不断调用advance()通过算法改变value的值.
- 2 怎么使用.
final OverShoot mScaleOverShoot;
private final BaseElasticitySystem mOverShootSystem = ElasticitySystem.create();
mScaleOverShoot = (OverShoot) mOverShootSystem.createElasticity(new OverShoot(mOverShootSystem)); mScaleOverShoot.setOverShootConfig(new OverShootConfig(velocity, 0.05, 3.0, 5.0));
mScaleOverShoot.addListener(new SimpleElasticityListener()
{
public void onSpringUpdate(Elasticity elasticity)
{
float value = (float) elasticity.getValue();
ViewHelper.setTranslationY(view, value);
}
}
);
- 3 成果展示
- 4.后续优化
a.这是个不完整的框架,后续将持续优化,github地址,https://github.com/djh123/Elasticity
b.后续输出demo