让动画不再僵硬:Facebook Rebound Android动画库介绍
2016-02-14 15:38
573 查看
introduction
official site:http://facebook.github.io/reboundgithub : https://github.com/facebook/rebound
Rebound是facebook推出的一个弹性动画库,可以让动画看起来真实自然,像真实世界的物理运动,带有力的效果,使用的参数则是facebook的origami中使用的。
官网上有一个简单的JS版本来做demo,如果说到evernote、LinkedIn、flow等应用也在使用这个动画库,是不是会显得更厉害些呢。
具体效果,可以看看QQ空间 Android独立版客户端中,抽屉打开的icon效果,以及底部加号点开后的icon效果,是我当年在的时候做的。
usage
1 2 3 4 5 6 7 8 9 10 | Spring spring = mSpringSystem .createSpring() .setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(86, 7)) .addListener(new SimpleSpringListener() { @Override public void onSpringUpdate(Spring spring) { float value = (float) spring.getCurrentValue(); ViewHelper.setTranslationX(view, value); } }); |
类似地
1 2 3 4 5 6 7 8 9 1011 | Spring spring = mSpringSystem .createSpring() .setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(86, 7)) .addListener(new SimpleSpringListener() { @Override public void onSpringUpdate(Spring spring) { float value = (float) spring.getCurrentValue(); float scale = 1f - value; ViewHelper.setScaleX(mItemIconViewList.get(index), scale); ViewHelper.setScaleY(mItemIconViewList.get(index), scale); } }); |
如果想要做很多view的连锁动画怎么办?Rebound也提供了SpringChain这个接口。
1 2 3 4 5 6 7 8 9 1011 | for (int i = 0; i < viewCount; i++) { final View view = new View(context); view.setLayoutParams( new TableLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1f)); mSpringChain.addSpring(new SimpleSpringListener() { @Override public void onSpringUpdate(Spring spring) { float value = (float) spring.getCurrentValue(); view.setTranslationX(value); } }); int color = (Integer) evaluator.evaluate((float) i / (float) viewCount, startColor, endColor); view.setBackgroundColor(color); view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return handleRowTouch(v, event); } }); mViews.add(view); rootView.addView(view); } getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { getViewTreeObserver().removeOnGlobalLayoutListener(this); List<Spring> springs = mSpringChain.getAllSprings(); for (int i = 0; i < springs.size(); i++) { springs.get(i).setCurrentValue(-mViews.get(i).getWidth()); } postDelayed(new Runnable() { @Override public void run() { mSpringChain .setControlSpringIndex(0) .getControlSpring() .setEndValue(0); } }, 500); } }); |
相关文章推荐
- 看Android开发笔记之:消息循环与Looper的详解有感
- Android 接入支付宝支付只需十分钟
- Android Studio发布项目到jcenter升级版
- android的Unable to instantiate activity ComponentInfo异常
- android SharedPreferences详解
- android.intent.category.LAUNCHER的作用
- Android 仿知乎日报在切换Fragment页面,按back返回时,同步修改Toolbar的title。
- 【读书笔记】【Android 开发艺术探索】第11章Android 的线程和线程池
- [读书笔记]《Android开发艺术探索》第四章笔记
- “Genymotion运行Android模拟器一直卡在开机界面”的解决办法
- Android Touch事件传递机制
- Android屏幕适配
- Android本地数据存储
- Android反编译看看手Q口令红包的实现原理
- Android获取手机的基本信息
- Android编程规范与常用技巧
- android开发环境搭建时连接不上Google解决办法
- Android 的电池消耗优化 II-监测电量等级和充电状态
- android style的继承方式 点(.)和parent
- android:px,dp(dip),sp的区别