当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

8.4.4 Android动画合集之属性动画-又见

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:27:46

本节引言:上节我们对Android的属性动画进行了初步的学习,相信大家对于属性动画已经不再是一知半解的状态了,本节我们继续来探究Android属性动画的一些更高级的用法!依旧贴下郭神的三篇文章~Android属性动画完全解析(上),初识属性动画的基本用法 Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法 Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法内容依旧是参考的上述三篇文章,好的,开始本节内容~1.Evaluator自定义1)Evaluator介绍上一节中的8.4.3 Android动画合集之属性动画-初见,使用动画的第一步都是:调用ValueAnimator的ofInt(),ofFloat()或ofObject()静态方法创建ValueAnimator实例!在例子中,ofInt和ofFloat我们都用到了,分别用于对浮点型和整型的数据进行动画操作!那么ofObject()?初始对象和结束对象?如何过渡法?或者说这玩意怎么用?好的,带着疑问,我们先来了解一个东西:Evaluator,在属性动画概念叨叨逼处其实我们就说到了这个东西:用来告诉动画系统如何从初始值过渡到结束值!好的,我们的入手点没错!我们进去IntEvaluator的源码,看下里面写了些什么?嗯,实现了TypeEvaluator接口,然后重写了evaluate()方法,参数有三个,依次是:fraction:动画的完成度,我们根据他来计算动画的值应该是多少startValue:动画的起始值endValue:动画的结束值动画的值 = 初始值 + 完成度 * (结束值 - 初始值)同样的还有FloatEvaluator,我们想告诉系统如何从初始对象过度到结束对象,那么我们就要自己来实现TypeEvaluator接口,即自定义Evaluator了,说多无益,写个例子来看看:2)使用示例运行效果图:代码实现:定义一个对象Point.java,对象中只有x,y两个属性以及get,set方法~/** * Created by Jay on 2015/11/18 0018. */public class Point { private float x; private float y; public Point() { } public Point(float x, float y) { this.x = x; this.y = y; } public float getX() { return x; } public float getY() { return y; } public void setX(float x) { this.x = x; } public void setY(float y) { this.y = y; }}接着自定义Evaluator类:PointEvaluator.java,实现接口重写evaluate方法~/** * Created by Jay on 2015/11/18 0018. */public class PointEvaluator implements TypeEvaluator<Point>{ @Override public Point evaluate(float fraction, Point startValue, Point endValue) { float x = startValue.getX() + fraction * (endValue.getX() - startValue.getX()); float y = startValue.getY() + fraction * (endValue.getY() - startValue.getY()); Point point = new Point(x, y); return point; }}然后自定义一个View类:AnimView.java,很简单~/** * Created by Jay on 2015/11/18 0018. */public class AnimView extends View { public static final float RADIUS = 80.0f; private Point currentPoint; private Paint mPaint; public AnimView(Context context) { this(context, null); } public AnimView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public AnimView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.BLUE); } private void drawCircle(Canvas canvas){ float x = currentPoint.getX(); float y = currentPoint.getY(); canvas.drawCircle(x, y, RADIUS, mPaint); } private void startAnimation() { Point startPoint = new Point(RADIUS, RADIUS); Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS); ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { currentPoint = (Point) animation.getAnimatedValue(); invalidate(); } }); anim.setDuration(3000l); anim.start(); } @Override protected void onDraw(Canvas canvas) { if (currentPoint == null) { currentPoint = new Point(RADIUS, RADIUS); drawCircle(canvas); startAnimation(); } else { drawCircle(canvas); } }}最后MainActivity.java处实例化这个View即可~public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new AnimView(this)); }}3)示例增强版我们上面示例的基础上加上圆移动时的颜色变化~这里我们另外用一个ObjectAnimator来加载颜色变化的动画,我们在View中加多个int color来控制颜色,另外写上getColor()和setColor()的方法,我们先来自定义个Evaluator吧~运行效果图:实现代码:ColorEvaluator.java:/** * Created by Jay on 2015/11/18 0018. */public class ColorEvaluator implements TypeEvaluator<Integer>{ @Override public Integer evaluate(float fraction, Integer startValue, Integer endValue) { int alpha = (int) (Color.alpha(startValue) + fraction * (Color.alpha(endValue) - Color.alpha(startValue))); int red = (int) (Color.red(startValue) + fraction * (Color.red(endValue) - Color.red(startValue)));

[1] [2] [3]  下一页


8.4.4 Android动画合集之属性动画-又见