ios动画和android动画
长久以来我都有这么一个疑问,为什么同样的设计,同样的动画效果,在ios上的效果要明显好于android呢?随着开发经验的积累接触到更多种类的开发机,我发现主要的原因在于ios动画效果和屏幕显示效果,默认的ios动画是有弹性效果,而在android平台上动画都是生硬的效果,而且大部分公司的设计都是以ios为基准,MD设计的android app少之又少,ios的显示效果自然好于android平台,那android上有没有类似属性动画的api,又有弹性效果的动画库呢?Facebook-Rebound就是这种库。
Facebook-Rebound
下面是官方给的一个简单的例子:
<pre>
// Create a system to run the physics loop for a set of springs.
SpringSystem springSystem = SpringSystem.create();
// Add a spring to the system.
Spring spring = springSystem.createSpring();
// Add a listener to observe the motion of the spring.
spring.addListener(new SimpleSpringListener() {
@Override
public void onSpringUpdate(Spring spring) {
// You can observe the updates in the spring
// state by asking its current value in onSpringUpdate.
float value = (float) spring.getCurrentValue();
float scale = 1f - (value * 0.5f);
myView.setScaleX(scale);
myView.setScaleY(scale);
}
});
// Set the spring in motion; moving from 0 to 1
spring.setEndValue(1);
</pre>
主要用到两个类: SpringSystem,Spring。
需要注意的是 currentValue 和 endValue,类似于属性动画的变长参数用于指定起始值和结束值,currentValue默认为零,例如我想把一个view的scale从0.5到1变化:
<pre>
spring.setCurrentValue(0.5);
spring.setEndValue(1);
</pre>
如果看过了rebund的官网,其中有一个有趣的demo,点击图片会有弹动的效果,其中有两个参数需要配置: tension(张力 1~100),friction(摩擦力 1~30)张力越大,摩擦力越小弹动的效果越明显,弹动的时间也越久。
代码里通过SpringConfig配置:
<pre>
SpringConfig springConfig = new SpringConfig(100,1);
spring.setSpringConfig(springConfig);
</pre>
多view连锁动画
使用SpringChain,提供两个构造方法
<pre>
SpringChain.create();
SpringChain.create(int mainTension,int mainFriction,int attachmentTension,int attachmentFriction)
默认
DEFAULT_MAIN_TENSION = 40;
DEFAULT_MAIN_FRICTION = 6;
DEFAULT_ATTACHMENT_TENSION = 70;
DEFAULT_ATTACHMENT_FRICTION = 10;
</pre>
eg:
<pre>
void chainAnim(){
ViewGroup viewGroup = (ViewGroup) findViewById(R.id.chain_layout);
viewGroup.setVisibility(View.VISIBLE);
SpringChain springChain = SpringChain.create();
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
final View view = viewGroup.getChildAt(i);
springChain.addSpring(new SimpleSpringListener() {
@Override
public void onSpringUpdate(Spring spring) {
view.setTranslationX((float) spring.getCurrentValue());
}
});
}
List<Spring> springs = springChain.getAllSprings();
for (int i = 0; i < springs.size(); i++) {
springs.get(i).setCurrentValue(1080);
}
springChain.setControlSpringIndex(0).getControlSpring().setEndValue(0);
}
</pre>
</pre>
效果:
eg2:
多view动画无连锁效果
<pre>
private void animateViewDirection(final View v, float from, float to, double tension, double friction) {
Spring spring = SpringSystem.create().createSpring();
spring.setCurrentValue(from);
spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(tension, friction));
spring.addListener(new SimpleSpringListener() {
@Override
public void onSpringUpdate(Spring spring) {
v.setTranslationY((float) spring.getCurrentValue());
}
});
spring.setEndValue(to);
}
</pre>
ViewGroup viewGroup = (ViewGroup) getWindow().getDecorView();
ViewGroup content = (ViewGroup) LayoutInflater.from(SpringActivity.this).inflate(R.layout.decor_content,viewGroup);
for(int i=0;i<content.getChildCount;i++)
{
View childView = content.getChildAt(i);
animateViewDirection(childView,500,0,50,4);
}
效果: