为了账号安全,请及时绑定邮箱和手机立即绑定

基本的路径动画框架

标签:
Android
private FloatingActionButton fab;移动的imageview,一个可以设置阴影的imageview
/*设置动画路径*/
public void setPath(){
    path = new AnimatorPath();
    path.moveTo(0,0);
    path.lineTo(400,400);
    path.secondBesselCurveTo(600, 200, 800, 400); //订单
    path.thirdBesselCurveTo(100,600,900,1000,200,1200);
}
设置路径。这个path是自定义的,里面只有一些动作的类型属性和点的属性
/**
 * 设置动画
 * @param view 使用动画的View
 * @param propertyName 属性名字
 * @param path 动画路径集合
 */
private void startAnimatorPath(View view, String propertyName, AnimatorPath path) {
    ObjectAnimator anim = ObjectAnimator.ofObject(this, propertyName, new PathEvaluator(), path.getPoints().toArray());
    anim.setInterpolator(new DecelerateInterpolator());
    anim.setDuration(3000);
    anim.start();
}
/**
 * 设置View的属性通过ObjectAnimator.ofObject()的反射机制来调用
 * @param newLoc
 */
public void setFab(PathPoint newLoc) {
    fab.setTranslationX(newLoc.mX);
    fab.setTranslationY(newLoc.mY);
}
这里是反射机制调用activity里面的fab控件。也是属性,设置他的XY移动的值
public class PathEvaluator implements TypeEvaluator<PathPoint> {

    /**
     * @param t          :执行的百分比
     * @param startValue : 起点
     * @param endValue   : 终点
     * @return
     */
    @Override
    public PathPoint evaluate(float t, PathPoint startValue, PathPoint endValue) {
        float x, y;
        float oneMiunsT = 1 - t;
        //三阶贝塞尔曲线
        if (endValue.mOperation == PathPoint.THIRD_CURVE) {
            x = startValue.mX*oneMiunsT*oneMiunsT*oneMiunsT+3*endValue.mContorl0X*t*oneMiunsT*oneMiunsT+3*endValue.mContorl1X*t*t*oneMiunsT+endValue.mX*t*t*t;
            y = startValue.mY*oneMiunsT*oneMiunsT*oneMiunsT+3*endValue.mContorl0Y*t*oneMiunsT*oneMiunsT+3*endValue.mContorl1Y*t*t*oneMiunsT+endValue.mY*t*t*t;
        //二阶贝塞尔曲线
        }else if(endValue.mOperation == PathPoint.SECOND_CURVE){
            x = oneMiunsT*oneMiunsT*startValue.mX+2*t*oneMiunsT*endValue.mContorl0X+t*t*endValue.mX;
            y = oneMiunsT*oneMiunsT*startValue.mY+2*t*oneMiunsT*endValue.mContorl0Y+t*t*endValue.mY;
        //直线
        }else if (endValue.mOperation == PathPoint.LINE) {
            //x起始点+t*起始点和终点的距离
            x = startValue.mX + t * (endValue.mX - startValue.mX);
            y = startValue.mY + t * (endValue.mY - startValue.mY);
        } else {
            x = endValue.mX;
            y = endValue.mY;
        }
        return PathPoint.moveTo(x,y);
    }
}
这个自定义估值器,能够根据传入的值,不断改变返回值的X,Y坐标

原文链接:http://www.apkbus.com/blog-865677-63456.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消