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

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

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

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就好~2.Interpolator(补间器)嗯,在讲补间动画的时候我们就讲过这个东东了~不知道你还有印象没?上面的补间器补间动画和属性动画都可用,而且补间动画还新增了一个TimeInterpolator接口该接口是用于兼容之前的Interpolator的,这使得所有过去的Interpolator实现类都可以直接拿过来放到属性动画当中使用!我们可以调用动画对象的setInterpolator()方法设置不同的Interpolator!我们先该点东西,让小球从屏幕正中央的顶部掉落到底部~然后我们会我们为我们的集合动画调用下述语句:animatorSet.setInterpolator(new AccelerateInterpolator(2f));括号里的值用于控制加速度~运行效果:好像有点不和常理,正常应该是会弹起来的吧,我们换成BounceInterpolator试试~嘿嘿,效果蛮赞的,当然还有N多个系统提供好的Interpolator,大家可以自己一一尝试,这里就不慢慢跟大家纠结了~下面我们来看看:1)Interpolator的内部实现机制我们先到TimeInterpolator接口的源码,发现这里只有一个getInterpolation()方法;简单的解释:getInterpolation()方法中接收一个input参数,这个参数的值会随着动画的运行而不断变化,不过它的变化是非常有规律的,就是根据设定的动画时长匀速增加,变化范围是0到1。也就是说当动画一开始的时候input的值是0,到动画结束的时候input的值是1,而中间的值则是随着动画运行的时长在0到1之间变化的。这里的input值决定了我们TypeEvaluator接口里的fraction的值。input的值是由系统经过计算后传入到getInterpolation()方法中的,然后我们可以自己实现getInterpolation()方法中的算法,根据input的值来计算出一个返回值,而这个返回值就是fraction了。我们可以看看LinearInterpolator里的代码:这里没有处理过直接返回input值,即fraction的值就是等于input的值,这就是匀速运动的Interpolator的实现方式!其实无非就是算法不同,这就涉及到一些数学的东西了,又一次体会到数学的重要性了,这里再贴个BounceInterpolator的源码吧:别问我这里的算法,我也不知道哈,我们再找个容易理解点的:AccelerateDecelerateInterpolator这个Interpolator是先加速后减速效果的:(float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f 的算法理解:解:由input的取值范围为[0,1],可以得出cos中的值的取值范围为[π,2π],对应的值为-1和1;再用这个值来除以2加上0.5之后,getInterpolation()方法最终返回的结果值范围还是[0,1],对应的曲线图如下:所以是一个先加速后减速的过程!嗯,学渣没法玩了...,上面全是郭大叔文章里搬过来的...我想静静...2)自定义Interpolator好吧,还是等会儿再忧伤吧,写个自定义的Interpolator示例先:非常简单,实现TimeInterpolator接口,重写getInterpolation方法示

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


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