# FloatingText FloatingText 是一个能够在任何控件之上执行漂浮效果动画的控件, 目前已有的漂浮效果有 '位移漂浮' ,'缩放漂浮','曲线路径漂浮',更重要的是 FloatingText 能够自定义漂浮效果. ## 版本限制 需要在 Android 3.0 以上 ## 安装 ## 使用: 1. 使用 FloatingText.FloatingTextBuilder 去创建一个FloatingText,通过FloatingTextBuilder可以配置下面几个属性: ``` FloatingText floatingText = new FloatingText.FloatingTextBuilder(Activity) .textColor(Color.RED) // 漂浮字体的颜色 .textSize(100) // 浮字体的大小 .textContent("+1000") // 浮字体的内容 .offsetX(100) // FloatingText 相对其所贴附View的水平位移偏移量 .offsetY(100) // FloatingText 相对其所贴附View的垂直位移偏移量 .floatingAnimatorEffect(FloatingAnimator) // 漂浮动画 .floatingPathEffect(FloatingPathEffect) // 漂浮的路径 .build(); floatingText.attach2Window(); //将FloatingText贴附在Window上 ``` 2.启动漂浮效果 ``` floatingText.startFloating(View); // 传入一个View,FloatingText 就会相对于这个View执行漂浮效果 ``` ## 自定义: #### 1.坐标系 FloatingText的坐标依赖于你所贴附的View 即:startFloating(View)中的View. #### 2.自定义漂浮动画 通过实现 `FloatingAnimator` 接口可以实现自定义漂浮动画: ``` public interface FloatingAnimator { public void applyFloatingAnimation(FloatingTextView view); } ``` **[ReboundFloatingAnimator](https://github.com/UFreedom/FloatingText/blob/master/FloatingTextLibrary%2Fsrc%2Fmain%2Fjava%2Fcom%2Fufreedom%2Feffect%2FReboundFloatingAnimator.java)** `ReboundFloatingAnimator` 实现了 FloatingAnimator 并提供回弹功能,ReboundFloatingAnimator 使用 Facebook 的回弹动画库 [Rebound](https://github.com/facebook/rebound)。 - 使用 `createSpringByBouncinessAndSpeed` 配置回弹动画的弹力和速度,并创建Spring。 - 使用 `createSpringByTensionAndFriction` 配置回弹动画的张力和摩擦力,并创建Spring - 调用 `transition(float progress, float startValue, float endValue)` 并传入当前动画的进度,动画的起始值,结束值可以获取当前的动画值 目前库内的 [ScaleFloatingAnimator](https://github.com/UFreedom/FloatingText/blob/master/FloatingTextLibrary%2Fsrc%2Fmain%2Fjava%2Fcom%2Fufreedom%2Feffect%2FScaleFloatingAnimator.java) ,[TranslateFloatingAnimator](https://github.com/UFreedom/FloatingText/blob/master/FloatingTextLibrary%2Fsrc%2Fmain%2Fjava%2Fcom%2Fufreedom%2Feffect%2FTranslateFloatingAnimator.java),[BaseFloatingPathAnimator](https://github.com/UFreedom/FloatingText/blob/master/FloatingTextLibrary%2Fsrc%2Fmain%2Fjava%2Fcom%2Fufreedom%2FBaseFloatingPathAnimator.java)都是实现了 `ReboundFloatingAnimator`。 例如 缩放回弹效果: `ScaleFloatingAnimator` ``` public class ScaleFloatingAnimator extends ReboundFloatingAnimator { public long duration; public ScaleFloatingAnimator() { duration = 1000; } public ScaleFloatingAnimator(long duration) { this.duration = duration; } @Override public void applyFloatingAnimation(final FloatingTextView view) { Spring scaleAnim = createSpringByBouncinessAndSpeed(10, 15) .addListener(new SimpleSpringListener() { @Override public void onSpringUpdate(Spring spring) { float transition = transition((float) spring.getCurrentValue(), 0.0f, 1.0f); view.setScaleX(transition); view.setScaleY(transition); } }); ValueAnimator alphaAnimator = ObjectAnimator.ofFloat(1.0f, 0.0f); alphaAnimator.setDuration(duration); alphaAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { view.setAlpha((Float) valueAnimator.getAnimatedValue()); } }); scaleAnim.setEndValue(1f); alphaAnimator.start(); } } ``` #### 3.自定义漂浮路径 通过实现 `FloatingPathEffect` 和 `FloatingPathAnimator` 可以自定义路径动画 - `FloatingPath` 代表浮动路径 ``` public interface FloatingPathEffect { abstract FloatingPath getFloatingPath(FloatingTextView floatingTextView); } ``` 使用 Path 创建路径,并调用 FloatingPath.create(Path path, boolean forceClose) 创建一个漂浮路径。 其中 forceClose 代表是否对路径进行闭合处理,一般情况下为 false。 例如:CurveFloatingPathEffect 实现了曲线路径效果: ``` public class CurveFloatingPathEffect implements FloatingPathEffect { @Override public FloatingPath getFloatingPath(FloatingTextView floatingTextView) { Path path = new Path(); path.moveTo(0, 0); path.quadTo(-100, -200, 0, -300); path.quadTo(200, -400, 0, -500); return FloatingPath.create(path, false); } } ``` #### 3.定义路径漂浮动画 当使用 `FloatingPathEffect` 定义完 路径后,就可以实现 `BaseFloatingPathAnimator` 来执行路径动画 例如 `CurvePathFloatingAnimator` 的效果是曲线漂浮动画: ``` public class CurvePathFloatingAnimator extends BaseFloatingPathAnimator { @Override public void applyFloatingPathAnimation(final FloatingTextView view, float start, float end) { ValueAnimator translateAnimator = ObjectAnimator.ofFloat(start, end); translateAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { float value = (float) valueAnimator.getAnimatedValue(); float pos[] = getFloatingPosition(value); float x = pos[0]; float y = pos[1]; view.setTranslationX(x); view.setTranslationY(y); } }); translateAnimator.setDuration(3000); translateAnimator.setStartDelay(50); translateAnimator.start(); } } ``` - 在 `applyFloatingPathAnimation(final FloatingTextView view, float start, float end)` 实现路径动画。参数 start 代表路径的开始位置,end代表路径的结束位置. - 通过 `getFloatingPosition(float progress)` 可以获取当前路径的位置信息 [0]代表x值,[1]代表y值