D11

Wesley13
• 阅读 658

零、前言

估值器和插值器丰富了动画更新时的效果
为方便本案例演示使用了我的LogicCanvas绘图库--github地址,当然你也可以自己绘制
估值器:TypeEvaluator :该以什么方式运动
插值器:运动的变化情况


一、估值器--TypeEvaluator:

1.以二次曲线移动为例:

D11

二次曲线.gif

绘制:动态改变p值
mPainter = PainterEnum.INSTANCE.getInstance(canvas);
mPainter.draw(sa.deepClone()
        .r(mCircleR).ang(360)
        .fs(mColor).p(mCircleR, -mCircleR).coo(0, 1600).p(currentPoint));
估值器:
public class PosX2Evaluator implements TypeEvaluator {

    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        //初始点
        Pos startPos = (Pos) startValue;
        //结束点
        Pos endPos = (Pos) endValue;
        //计算每次更新时的x坐标
        float x = startPos.x + fraction * (endPos.x - startPos.x);
        //将y坐标进行联动
        float y = x * x / 800;
        //返回更新后的点
        return endPos.clone(x, y);
    }
}
更新监听
Pos startP = currentPoint;//初始值(起点)
Pos endP = new Pos(1000, mCircleR);//结束值(终点)
ValueAnimator animator = ValueAnimator.ofObject(new PosX2Evaluator(), startP, endP);
animator.setRepeatCount(-1);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.setDuration(5000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        currentPoint = (Pos) animation.getAnimatedValue();
        postInvalidate();
    }
});
animator.start();
2.log型:

D11

log型.gif

public class PosLogEvaluator implements TypeEvaluator {

    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        //初始点
        Pos startPos = (Pos) startValue;
        //结束点
        Pos endPos = (Pos) endValue;
        //计算每次更新时的x坐标
        float x = startPos.x + fraction * (endPos.x - startPos.x);
        //将y坐标进行联动
        float y = (float) (Math.log10(x) * 200);
        //返回更新后的点
        return endPos.clone(x, y);
    }
}
3.sin型:

D11

sin型.gif

public class PosSinEvaluator implements TypeEvaluator {

    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {

        //初始点
        Pos startPos = (Pos) startValue;
        //结束点
        Pos endPos = (Pos) endValue;
        //计算每次更新时的x坐标
        float x = startPos.x + fraction * (endPos.x - startPos.x);
        //将y坐标进行联动
        float y =  (float) (Math.sin(x * Math.PI / 180) * 200);
        //返回更新后的点
        return endPos.clone(x, y);
    }
}

由此可以看出:不同的移动曲线只是在x坐标变化是对y坐标的不同处理。这就是估值器的作用。


二、插值器--TimeInterpolator

注意输出值也是要在0~1之间的变化数
安卓内置了一下插值器,就不说了,使用自定义插值器来说明其中的原理

1.定义sin型插值器:

D11

sin减速.gif

/**
 * 作者:张风捷特烈
 * 时间:2018/7/9:10:08
 * 邮箱:1981462002@qq.com
 * 说明:sin函数实现加速插值器
 */
public class D_Sin_Inter implements TimeInterpolator {
    @Override
    public float getInterpolation(float input) {
        //input是一个从0~1均匀变化的值
        //从0到PI/2均匀变化的值
        float rad = Logic.rad(90 * input);
        //返回这个弧度的sin值--sin曲线在0~PI/2区域是增长越来越缓慢,是的小球运动越来越缓慢
        return (float) (Math.sin(rad));
    }
}

使用:

 animator.setInterpolator(new D_Sin_Inter());
2.定义Log型减速

D11

log型减速.gif

/**
 * 作者:张风捷特烈
 * 时间:2018/7/9:10:08
 * 邮箱:1981462002@qq.com
 * 说明:log函数实现加速插值器
 */
public class D_Log_Inter implements TimeInterpolator {
    @Override
    public float getInterpolation(float input) {
        return (float) (Math.log10(1 + 10 * input));
    }
}

要加速效果将返回值改为1-XXX就行了
插值器从表现上来看就是某个函数值域在0~1上的图象曲率变化的速率作用与View的某个属性上


三、插播一个路径动画吧:

使用sin型减速

D11

path绘制.gif

//初始画笔
mPaint = new Paint();
mPaint.setStrokeWidth(5);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
mPaint.setColor(Color.RED);
//实例路径
mPath =new ShapeStar(ShapeStar.MODE_REGULAR).num(8).R(200).formPath();
//测量路径
pathMeasure = new PathMeasure(mPath, false);


//动画设置
ValueAnimator pathAnimator = ValueAnimator.ofFloat(1, 0);
pathAnimator.setDuration(5000);
pathAnimator.setInterpolator(new D_Sin_Inter());
pathAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float value = (Float) animation.getAnimatedValue();
        DashPathEffect effect = new DashPathEffect(
                new float[]{
                        pathMeasure.getLength(),
                        pathMeasure.getLength()},
                value * pathMeasure.getLength());
        mPaint.setPathEffect(effect);
        invalidate();
    }
});
pathAnimator.start();


//绘制路径
canvas.drawPath(mPath, mPaint);

后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:

D11

公众号.jpg

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Golang注册Eureka的工具包goeureka发布
1.简介提供Go微服务客户端注册到Eureka中心。点击:github地址(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2FSimonWang00%2Fgoeureka),欢迎各位多多star!(已通过测试验证,用于正式生产部署)2.原理
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这