android那些事--屬性動畫04TypeEvaluator的使用
通過對ValueAnimator
和ObjectAnimator
的使用,瞭解到在獲取動畫物件時只需要傳入起始和結束值系統就會自動完成值的平滑過渡,這個平滑過渡的完成就是靠TypeEvaluator
這個類.還是一樣先看一下這個介面的介紹.
理論介紹
再看下android原始碼中FloatEvaluator
和IntEvaluator
這兩個子類是如何實現的.
這個是
FloatEvaluator
public class FloatEvaluator implements TypeEvaluator<Number> {
/**
* This function returns the result of linearly interpolating the start and end values, with
* <code>fraction</code> representing the proportion between the start and end values. The
* calculation is a simple parametric calculation: <code>result = x0 + t * (v1 - v0)</code>,
* where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>,
* and <code>t</code> is <code>fraction</code>.
*
* @param fraction The fraction from the starting to the ending values
* @param startValue The start value; should be of type <code>float</code> or
* <code>Float</code>
* @param endValue The end value; should be of type <code>float</code> or <code>Float</code>
* @return A linear interpolation between the start and end values, given the
* <code>fraction</code> parameter.
*/
public Float evaluate(float fraction, Number startValue, Number endValue) {
float startFloat = startValue.floatValue();
return startFloat + fraction * (endValue.floatValue() - startFloat);
}
}
這個是
IntEvaluator
public class IntEvaluator implements TypeEvaluator<Integer> {
/**
* This function returns the result of linearly interpolating the start and end values, with
* <code>fraction</code> representing the proportion between the start and end values. The
* calculation is a simple parametric calculation: <code>result = x0 + t * (v1 - v0)</code>,
* where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>,
* and <code>t</code> is <code>fraction</code>.
*
* @param fraction The fraction from the starting to the ending values
* @param startValue The start value; should be of type <code>int</code> or
* <code>Integer</code>
* @param endValue The end value; should be of type <code>int</code> or <code>Integer</code>
* @return A linear interpolation between the start and end values, given the
* <code>fraction</code> parameter.
*/
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(startInt + fraction * (endValue - startInt));
}
}
可以看出這是兩個非常實在的類,哈哈.
用結束值減去初始值,算出它們之間的差值,然後乘以fraction這個係數,再加上初始值,那麼就得到當前動畫的值了
實際使用
簡單需求:自定義一個View,在View中有一個Point物件用於管理座標,然後在onDraw()方法中根據Point座標進行繪製.
分析:我們已經知道資料的平滑過渡是怎麼產生的了,那麼如果可以對Point物件進行平滑過渡則自定義View就可以實現需要的動畫效果.
- 自定義一個Evaluator,完成Point平滑的過渡
- 在自定義View中啟動Point的動畫,得到不斷更新的Point物件
- 更新新的Point物件重新對View進行繪製
自定義的Evaluator類
public class PointEvaluator implements TypeEvaluator<Point> {
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
float resultX = startValue.getX() + fraction * (endValue.getX() - startValue.getX());
float resultY = startValue.getY() + fraction * (endValue.getY() - startValue.getX());
return new Point(resultX, resultY);
}
}
Point物件輔助性完成
public class Point {
private float x;
private float y;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
最終的自定義的View
public class MyView extends View {
private Paint mPaint;
private Point mPoint;
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLUE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mPoint == null) {
mPoint = new Point(50, 50);
drawCircle(canvas);
startAnimation();
} else {
drawCircle(canvas);
}
}
private void drawCircle(Canvas canvas) {
canvas.drawCircle(mPoint.getX(), mPoint.getY(), 50, mPaint);
}
private void startAnimation() {
Point startPoint = new Point(50, 50);
Point endPoint = new Point(getWidth() - 50, getHeight() - 50);
ValueAnimator animator = ValueAnimator
.ofObject(new PointEvaluator(), startPoint, endPoint);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mPoint = ((Point) animation.getAnimatedValue());
LogUtil.i(mPoint.getX()+"------"+mPoint.getY());
invalidate();
}
});
animator.setDuration(5000);
animator.start();
}
}
相關文章
- Android 動畫之屬性動畫Android動畫
- android屬性動畫Android動畫
- Android屬性動畫詳解(一),屬性動畫基本用法Android動畫
- android動畫——屬性動畫(Property Animation)Android動畫
- Android屬性動畫:動畫流控制Android動畫
- Android 屬性動畫(二)Android動畫
- android關於屬性動畫的七個使用案例Android動畫
- 【Android 動畫】動畫詳解之屬性動畫(三)Android動畫
- 【Android 動畫】動畫詳解之屬性動畫(五)Android動畫
- Android 屬性動畫實戰Android動畫
- 如何理解Android屬性動畫Android動畫
- Android 動畫詳解:屬性動畫、View 動畫和幀動畫Android動畫View
- Android開發之屬性動畫Android動畫
- Android 屬性動畫Property Animation(中)Android動畫
- Android 屬性動畫Property Animation(下)Android動畫
- Android學習之 屬性動畫Android動畫
- 初識屬性動畫——使用Animator建立動畫動畫
- 屬性動畫:基本使用和組合動畫動畫
- Android動畫效果之初識Property Animation(屬性動畫)Android動畫
- Android View動畫和屬性動畫簡單解析:AndroidView動畫
- Android動畫:這裡有一份很詳細的 屬性動畫 使用攻略Android動畫
- 屬性動畫動畫
- iOS動畫 屬性屬性解析iOS動畫
- Android動畫效果之Property Animation進階(屬性動畫)Android動畫
- Android 顏色漸變 屬性動畫Android動畫
- Android 自定義View:屬性動畫(六)AndroidView動畫
- Android備忘錄《屬性動畫-ValueAnimator》Android動畫
- Android Animation 系列——屬性動畫(Property Animation)Android動畫
- Android圖文詳解屬性動畫Android動畫
- Android原始碼解析(一)動畫篇-- Animator屬性動畫系統Android原始碼動畫
- 事務的屬性
- Android 樣式屬性的使用Android
- Android學習之 那些讓我生疏的配置屬性Android
- Java 混淆那些事(六):Android 混淆的那些瑣事JavaAndroid
- 關於android:layout_weight屬性使用注意事項Android
- Android打包的那些事Android
- SVG restart動畫屬性SVGREST動畫
- SVG restart 動畫屬性SVGREST動畫