安卓中的差值器和估值器

1.差值器TimeInterpolator

从名字上可以看出,这个是跟时间有关的,差值器只是能修改速率的一种东西。

比如,匀速,快到慢,慢到快,快慢快或者慢快慢。

安卓本身提供给我们两个内置的差值器

1.匀速插值器:LinearInterpolator
2.先加速再减速 插值器:AccelerateDecelerateInterpolator

自定义差值器


public class DecelerateAccelerateInterpolator implements TimeInterpolator {

    @Override
    public float getInterpolation(float input) {
        float result;
        if (input <= 0.5) {
            result = (float) (Math.sin(Math.PI * input)) / 2;
            // 使用正弦函数来实现先减速后加速的功能,逻辑如下:
            // 因为正弦函数初始弧度变化值非常大,刚好和余弦函数是相反的
            // 随着弧度的增加,正弦函数的变化值也会逐渐变小,这样也就实现了减速的效果。
            // 当弧度大于π/2之后,整个过程相反了过来,现在正弦函数的弧度变化值非常小,渐渐随着弧度继续增加,变化值越来越大,弧度到π时结束,这样从0过度到π,也就实现了先减速后加速的效果
        } else {
            result = (float) (2 - Math.sin(Math.PI * input)) / 2;
        }
        return result;
        // 返回的result值 = 随着动画进度呈先减速后加速的变化趋势
    }

		mButton = (Button) findViewById(R.id.Button);
        // 创建动画作用对象:此处以Button为例

        float curTranslationX = mButton.getTranslationX();
  ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX);
        // 创建动画对象 & 设置动画
        // 表示的是:
        // 动画作用对象是mButton
        // 动画作用的对象的属性是X轴平移
        // 动画效果是:从当前位置平移到 x=1500 再平移到初始位置
        animator.setDuration(5000);
        animator.setInterpolator(new DecelerateAccelerateInterpolator());

2.估值器TypeEvaluator

设置 属性值 从初始值过渡到结束值 的变化具体数值

插值器(Interpolator)决定值的变化规律(匀速、加速blabla),即决定的是变化趋势;而接下来的具体变化数值则交给估值器

系统内置的估值器有3个:

IntEvaluator:以整型的形式从初始值 - 结束值 进行过渡
FloatEvaluator:以浮点型的形式从初始值 - 结束值 进行过渡
ArgbEvaluator:以Argb类型的形式从初始值 - 结束值 进行过渡

自定义估值器
class PoinSinEvaluator implements TypeEvaluator{

		@Override
		public Object evaluate(float fraction, Object startValue, Object endValue) {
			Point startPoint= (Point) startValue;
			Point endPoint= (Point) endValue;
			int x= (int) (startPoint.x+fraction*(endPoint.x-startPoint.x));
			int y= (int) ((Math.sin(x * Math.PI / 180) * 100)+endPoint.y / 2);
			return new Point(x,y);
		}
	}
	Point startPoint=new Point(RADU,RADU);
		Point endP=new Point(getWidth()-RADU,getHeight()-RADU);

		final ValueAnimator animator=ValueAnimator.ofObject(new PoinSinEvaluator(),startPoint,endP);
		animator.setRepeatCount(-1);
		animator.setRepeatMode(ValueAnimator.REVERSE);
		animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				currentPoint= (Point) animation.getAnimatedValue();
				postInvalidate();
			}
		});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值