属性动画使用详解2(Evaluator与Interpolator)
来源:互联网 发布:js清除域名所有cookie 编辑:程序博客网 时间:2024/06/05 05:34
Evaluator自定义
先看效果图:
详细代码:
定义一个对象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)); }}
再nb一点的效果:详细代码:
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))); int green = (int) (Color.green(startValue) + fraction * (Color.green(endValue) - Color.green(startValue))); int blue = (int) (Color.blue(startValue) + fraction * (Color.blue(endValue) - Color.blue(startValue))); return Color.argb(alpha, red, green, blue); }}
然后自定义View那里加个color,get和set方法;创建一个ObjectAnimator, 和AnimatorSet,接着把动画组合到一起就到,这里就加点东西而已,怕读者有问题, 直接另外建个View吧~
AnimView2.java:
/** * Created by Jay on 2015/11/18 0018. */public class AnimView2 extends View { public static final float RADIUS = 80.0f; private Point currentPoint; private Paint mPaint; private int mColor; public AnimView2(Context context) { this(context, null); } public AnimView2(Context context, AttributeSet attrs) { super(context, attrs); init(); } public AnimView2(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(); } }); ObjectAnimator objectAnimator = ObjectAnimator.ofObject(this, "color", new ColorEvaluator(), Color.BLUE, Color.RED); //动画集合将前面两个动画加到一起,with同时播放 AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(anim).with(objectAnimator); animatorSet.setStartDelay(1000l); animatorSet.setDuration(3000l); animatorSet.start(); } @Override protected void onDraw(Canvas canvas) { if (currentPoint == null) { currentPoint = new Point(RADIUS, RADIUS); drawCircle(canvas); startAnimation(); } else { drawCircle(canvas); } } //color的get和set方法~ public int getColor() { return mColor; } public void setColor(int color) { mColor = color; mPaint.setColor(color); invalidate(); }}
然后MainActivity,setContentView那里把AnimView改成AnimView2就好~
Interpolator(补间器)
加速度:
弹球:
上面的补间器补间动画和属性动画都可用,而且补间动画还新增了一个TimeInterpolator接口 该接口是用于兼容之前的Interpolator的,这使得所有过去的Interpolator实现类都可以直接拿过来 放到属性动画当中使用!我们可以调用动画对象的setInterpolator()方法设置不同的Interpolator! 我们先该点东西,让小球从屏幕正中央的顶部掉落到底部~ 然后我们会我们为我们的集合动画调用下述语句: animatorSet.setInterpolator(new AccelerateInterpolator(2f)); 括号里的值用于控制加速度~
自定义Interpolator
非常简单,实现TimeInterpolator接口,重写getInterpolation方法
详细代码:
private class DecelerateAccelerateInterpolator implements TimeInterpolator { @Override public float getInterpolation(float input) { if (input < 0.5) { return (float) (Math.sin(input * Math.PI) / 2); } else { return 1 - (float) (Math.sin(input * Math.PI) / 2); } }}
调用setInterpolator(new DecelerateAccelerateInterpolator())设置下即可~ 不贴图了~ 1 0
- 属性动画使用详解2(Evaluator与Interpolator)
- 控件动画和属性动画(及Evaluator估值器、Interpolator插值器的使用)
- Android动画之PropertyAnimation;Interpolator;Evaluator与Keyframe
- android属性动画--Evaluator
- Android属性动画Interpolator(插值器)
- 插值器InterPolator & Evaluator
- Android学会属性动画的基本用法(下),Interpolator 与ViewPropertyAnimator的用法
- Android 属性动画 常用方法 与 插值器 Interpolator
- 属性动画中Interpolator原理
- Android Interpolator属性动画解析
- android 动画中插值器(Interpolator)属性的分析
- 属性动画使用详解
- Animation动画详解(二)——Interpolator插值器
- Animation动画详解(二)——Interpolator插值器
- 属性动画06-Interpolator的用法
- android初识属性动画---Interpolator插值器
- Android属性动画(下),InterPolator、ViewPropertyAnimator和布局动画的用法
- Android 属性动画探究(一)——Interpolator解析与自定义
- 【Android 开发入门】我认识中的Android
- Atom过滤工程文件
- 使用photoshop将图片制作成圆形
- debian 7 安装 rz sz lrzsz
- [从头读历史] 第241节 根据天时定历法
- 属性动画使用详解2(Evaluator与Interpolator)
- MySql均衡负载
- Mysq日志管理(错误日志、查询日志、慢查询日志)
- Mysql命令mysql:连接Mysql数据库
- Mysql命令mysqladmin:修改用户密码
- Mysql命令grant on:增加新用户并控制其权限
- Mysql命令create:创建数据库
- Mysql命令show databases:显示所有数据库
- 第20课:Spark Streaming中动态Batch Size实现初探