精华内容
下载资源
问答
  • 《全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自定义动画动作路径》由会员分享,可在线阅读,更多相关《全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自定义动画动作路径(9页...

    《全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自定义动画动作路径》由会员分享,可在线阅读,更多相关《全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自定义动画动作路径(9页珍藏版)》请在人人文库网上搜索。

    1、教案名称设置自定义动画动作路径年级 初二 课时 1一、教材分析自定义动画动作路径这节内容是八年级上册第二单元的内容,本单元主要介 绍了制作多媒体演示文稿的基本思路与方法,使学生在完成作品的实践过程中, 逐步提高应用多媒体素材的能力。PowerPoint是Microsof toff ice软件之一。它是一 种多功能的图文处理软件系统。PowerPoint的功能很强大,用它可以制作出包含 文本、图片、声音、动画和视频的多媒体作品。相对于word来说,效果丰富的动 画效果是powerpoint的精髓,而自定义动画可以实现各个要素独特的动画效果, 这节课学习的内容是怎样给幻灯片的操作对象设置动作路径,。

    2、从而达到一定的动 画效果。根据初二年级学生的学习水平以及信息技术新课标的要求,依据教材作 了适度的调整,通过实例(小猫钓鱼的故事情节)设计了本课。本节课是在学生 已掌握了幻灯片基本操作的基础上和自定义动画的“进入”、“强调”、“退 出”的基础上而设立的高层次的学习任务一一动作路径。本节课利用学生都熟悉 的故事小猫钓鱼,通过绘制动作路径让小猫、蝴蝶、蜡蜓等动起来完善故事 情节的过程中让学生学会设置动作路径。从而让学生达到学习U标。二、学生分析初二的学生经过初一一年的系统学习,同一年级学生运用信息技术能力及计 算机的基本操作能力都基本差不多,只有个别学生计算机操作能力较差些。 PowerPoint。

    3、这一单元的内容学生比较感兴趣,学生可以独立制作简单的幻灯片, 对于一些细节内容掌握的还不是太好。本节课的内容是在学生掌握了幻灯片基本 操作的基础上和自定义动画的“进入、强调、退出的基础上”而进一步学习的动 作路径的设置。学生对这一节内容比较感兴趣,通过故事情节的完善,学生之间 的互评让学生体验成功。对于动作路径的简单绘制学生容易掌握,但动作路径中 的开始选项“之询”和“之后”的运用,要给予学生重点讲解和演示,让学生掌 握这个知识点。对于一些学困生要个别指导,尽量让每个学生都掌握本课的知识 点。三、教学目标知识与技能:1、在掌握自定义动画“进入、强调、退出”的基础上,掌握较为复杂 的“动作路径”。

    4、的设置。2、掌握合适的动作路径,为幻灯片添加自定义动画的效果。过程与方法:精讲多练,创设情境,任务驱动,通过故事情节,选择合适的动作路径, 让小猫、蝴蝶、蜡蜓等动起来,完成自定义动画的设置,完善故事情节,实现动 作与画面的和谐统一。情感态度与价值观:通过自定义动画的设置和小猫钓鱼的故事,进一步培养学生学习信息技术的 兴趣,让学生明白做事不能三心二意,要一心一意,才能成功。四、教学重难点教学重点:1、绘制动作路径;2、动作路径的调整和设置:3、速度的调整4、开始选项的运用及设置教学难点:“开始”选项的“单击”、“之前”“之后”的运用及设置五、教学策略任务驱动,让学生自主学习自主完成任务的过程中,。

    5、教师适时的指导与提 示,发现问题集中讲解与演示。对于个别学生要个别辅导,学生完善故事惜节 后,自评、互评、师评发现问题,更加完善作品。六、教具准备多媒体计算机机房、教师授课演示文稿、练习素材七、教学过程(-)课题引入1、教师放映演示做好的PPT: “小猫钓鱼”播放小猫钓鱼演示文稿,并下发小猫钓鱼的练习素材给学生。教师提问:小猫钓鱼的故事告诉了我们一个什么道理?演示文稿中的小猫和蝴 蝶等是怎么动起来的?让学生思考运用昨天讲过的自定义动画前三种“进入”、“强调”、“退出”能否让小猫和蝴蝶等动起来?2、学生思考并回答问题,明白做事不能三心二意的,一心一意才能成功。尝 试用昨天的进入、强调让小猫动起来。

    6、动作不连贯,引出自定义动画第四个知识点“动作路径”。教师:现在我们就来学习这节课的内容一一设置自定义动画动作路径 设计意图:本环节通过创设情景引入课题,激发了学生的学习兴趣,使学生在学 习情境中主动、积极地接受任务,自然而然把学生引入学习情境中。(二) 学习新知:教师:首先出示学习H标:1、熟练绘制自定义动作路径2、根据要求适时地调整路径和速度3、学会运用和设置开始选项上节课我们讲了自定义动画的添加效果前三种:进入、强调、退出,今天我们 学习第四种:动作路径。亲爱的同学们,现在我们自己动手,用自定义动画动作 路径让小猫、蝴蝶、蜡蜓动起来,完善故事情节。任务一:根据故事情节,绘制动作路径让小猫和。

    7、猫妈妈同时出发到河边钓鱼(提示:“同时”如何设置“开始”选项)学生:打开练习素材,熟悉回顾“自定义动画”工具栏内的工具。自定义动画一一添加效果一一&、进入;b、强调;C、退出;d、动作路径。 尝试对“自定义动画”中的“设置动作路径”工具进行操作完成任务一。教师:巡视指导,发现问题及时提示纠正,对于个别操作能力差的学生个别指 导。最后教师集中讲解演示纠正发现的问题。强调之前的设置及运用(把猫妈妈 开始选项设置为单击、小猫设置为“之前”,速度都为中速,就可以实现小猫和 猫妈妈同时出发)没有完成任务一的学生继续修改完成,完成任务一的学生着手 操作完成任务二。任务二:用自定义动画实现蜡蜓飞来,小猫去追。

    8、逐蜻蜓(注意小猫有两个动 作,坐着变成站着,思考怎么运用上节课学过的“出现”、和“消失”)教师巡视指导,提示运用“之后”,回顾上节课的内容“出现”和“消失” 并运用到本节课中,然后把发现的问题集中讲解。任务三:试着用自定义路径中的自山曲线,分别绘制蝴蝶、蜡蜓飞过来的效 果,要求动作流畅。(提示蝴蝶和蜡蜓飞的路径并不是直的,所以要运用自曲曲 线)学生使用动作路径中的绘制自定义路径一一自山曲线,来选择一条路径完成 蝴蝶和蜡蜓在小猫身边、头上飞来飞去。教师巡视指导,然后发现问题集中讲解演示,强调绘制动作路径的操作要 领:1、选定对象2、绘制动作路径。3、动作路径的调整和设置。4、开始选项“之前”“之。

    9、后”的运用5、调节速度6、调整顺序任务四:保存作品,演示放映幻灯片,看有无制作错误,完善作品教师巡视指导过程中,发现有代表性的作品。设计意图:通过播放小猫钓鱼的幻灯片引起学生的兴趣,让学生觉得原来幻 灯片还可以把故事活灵活现的表现出来,布置任务让学生自主探究学习,养成良 好的学习习惯,给学生自我展示的机会,提高学习积极性。让学生体验成功的愉 悦。通过任务二、三、四综合练习,巩固知识,让知识转化为能力。通过这一环 节教学,让学生根据不同的情况设置不同的路径,提高学生的实际操作能力。(三)分享评价教师在巡视指导的过程中选出具有代表性的作品。展示个别学生作品,让同 学说出自己制作的思路,自认为优缺点。

    10、有哪些,其他同学评价,说出他们的优缺 点,然后教师点评。设计意图:通过自评、互评、师评让学生发现自己的优缺点,发现问题及时 改正优化缺点,完善作品,让学生掌握幻灯片自定义动画四种方式的设置。(四)课后作业:尝试自己编一个小故事,以幻灯片的方式把故事呈现出 来,要求故事画面整洁大方,动作路径绘制流畅,体现一定的艺术性,幻灯片之 间过度切换自然,并试着运用超链接。(超链接相关知识点参照下节内容)设计意图:拔高练习,让学生自己创作的过程中回顾本节内容,预习下节课 内容(幻灯片的切换方式、超链接)(五)总结教师:你学到了什么?学生回顾本节课自己所掌握的知识教师总结:本节课我们学习了自定义动画中的动作路。

    11、径,设置幻灯片的动画 效果,使我们的小猫、蝴蝶、蜡蜓等动起来,完善了故事情节,使我们感觉到幻 灯片功能的强大,在我们没有学过Flash的基础上,可以做出这样的动画效果。 本节课的知识点主要是绘制动作路径的操作要领:选定对象、绘制动作路径、 动作路径的调整和设置、开始选项“之前”“之后”的运用、调节速度、调整顺 序。同时通过小猫钓鱼的故事,不管我们学习或做事都不能三心二意、心不 在焉,只有一心一意、竭尽全力才能成功。学生通过老师的总结回顾所学的内容,强化知识点,领会小猫钓鱼故 事的蕴意。设计意图:通过归纳总结,理清知识脉络,为了让学生更好的明确知识点强 化巩固知识。课后作业:用幻灯片制作一个自己。

    12、喜欢的小故事,充分运用幻灯片中所学过 的知识点,充分地体现故事情节。设计意图:拔高练习八、教学反思优点:本节课参照教材知识点不是单纯地照本宣科讲授知识点,而是运用学 生都皆知的小故事小猫钓鱼,易于学生理解,吸引学生的注意力,激发学生 的学习兴趣。讲授新课之前给学生播放做好的小猫钓鱼幻灯片,让学生感觉 幻灯片也可以做出这样的动画效果,还可以用幻灯片的方式讲故事,播放完后明 显感觉学生对本课的内容非常感兴趣。都有种跃跃欲试的冲动,所以运用任务驱 动教学法,正迎合了学生的心理也培养了学生自主学习、自主探究、动手实践操 作的能力。在学生完成任务一、二、三的过程中,教师巡视指导,及时发现问题 加以纠正,。

    13、然后集中讲解强化知识点。讲练结合,利于学生发现错误及时纠正, 练习强化巩固知识。也可以明确所要掌握的知识点。在整个教学过程中,教师为 主导,学生为主体。分享评价环节,自评、互评、师评可以发扬优点改正缺点, 让学生体验成功再接再厉,也激励其他同学继续努力。课后作业,是一个拔高练 习,学生在创作的过程中可以回顾本节课内容也可以预习新知。教师在传授知识 的同时更要育人,通过实例小猫钓鱼的故事,让学生明口不管是做事还是学 习都不能三心二意,一心一意才有可能成功。缺点:虽然学生对本节课内容非常感兴趣,学生都投入到学习情境中,学生 的思路随着任务层层递进吸引学生的注意力,大部分学生都完成了教学内容,达 到。

    14、了教学目标,但忽略了对学困生的照顾,同时运用“出现”、“消失”、“之 前”、“之后”的设置,对于学困生来说,有一定的难度,所以在课上出现了一 大部分学生学得热火朝天,惊呼自己的杰作,自我陶醉无暇顾及帮助学困生,其 中有4、5个学生,到任务二和任务三时,干着急不知如何下手,默默欣赏别人作 品时有种失落感,尽管教师巡视指导时个别辅导,但在有限的时间内,学困生还 是不能较好的掌握难点。布置课后作业,对于学困生来说也有一定的难度。所 以,以后任务要分层,布置基础任务和拔高任务。作业也要分层。在课上也要学 生之间互帮互助,可以让先完成任务的学生充当小老师,帮助学困生。课程内容比较紧凑,在分享评价时不能展示更多学生的作品。所以以后在时间分配上要改进,多关注后进生,实行分层任务、分层作业, 完成基础任务多鼓励学困生,提高他们的学习自信心。810。

    展开全文
  • 下面介绍通过QPropertyAnimation实现自定义动画移动路径,比如走圆曲线、圆弧曲线等 pos动画属性 #include "myanimation.h" MyAnimation::MyAnimation(QObject *target, const QByteArray &propertyName, ...

    在使用Qt实现动画时,一般使用QPropertyAnimation来实现,一般我们实现控件的移动动画都是走直线,我们如何实现自己想要的移动路径呢,比如走圆弧。下面介绍通过QPropertyAnimation实现自定义动画移动路径,比如走圆曲线、圆弧曲线等

    pos动画属性

    #include "myanimation.h"
    
    MyAnimation::MyAnimation(QObject *target, const QByteArray &propertyName, QObject *parent):
        QPropertyAnimation (target, propertyName, parent)
    {
        setPathType(LinearPath);
    }
    
    void MyAnimation::setPathType(MyAnimation::PathType pathType)
    {
        if (pathType >= NPathTypes)
            qWarning("Unknown pathType %d", pathType);
    
        m_pathType = pathType;
        m_path = QPainterPath();
    }
    
    void MyAnimation::updateCurrentTime(int currentTime)
    {
        if (m_pathType == CirclePath || m_pathType == ArcPath) {
            if (m_path.isEmpty()) {
                QPointF to = endValue().toPointF();
                QPointF from = startValue().toPointF();
                m_path.moveTo(from);
                if(m_pathType == CirclePath) {
                    m_path.addEllipse(QRectF(from, to));
                }
                else {
                    qreal tempWidth = from.rx() - to.rx();
                    qreal tempHeight = from.ry() - to.ry();
                    QRectF tempRect = QRectF(to.x() - tempWidth, to.y(), tempWidth*2, tempHeight*2);
                    m_path.arcTo(tempRect, 0, 90);
                }
            }
            int dura = duration();
            const qreal progress = ((dura == 0) ? 1 : ((((currentTime - 1) % dura) + 1) / qreal(dura)));
    
            qreal easedProgress = easingCurve().valueForProgress(progress);
            if (easedProgress > 1.0) {
                easedProgress -= 1.0;
            } else if (easedProgress < 0) {
                easedProgress += 1.0;
            }
            QPointF pt = m_path.pointAtPercent(easedProgress);
            updateCurrentValue(pt);
            emit valueChanged(pt);
        } else {
            QPropertyAnimation::updateCurrentTime(currentTime);
        }
    }
    

    调用

    m_pMyAnmation = new MyAnimation(ui->pushButton, "pos", this);
    m_pMyAnmation->setDuration(1000);
    m_pMyAnmation->setStartValue(QPointF(400, 350));
    m_pMyAnmation->setEndValue(QPointF(200, 100));
    m_pMyAnmation->setPathType(MyAnimation::ArcPath);

    直线动画

    圆曲线动画

    圆弧曲线

    通过重载updateCurrentTime,根据时间节点取到自定义路径的位置,更新updateCurrentValue的值;对于自定义路径,实例中采用QPainterPath绘制圆和圆弧,也可使用QPainterPath绘制直线与圆弧组合等,也可实现其他曲线路径,如sin曲线等。

    geometry动画属性

    上面例子使用的是pos属性,也可以使用geometry,实现位置与大小组合的动画效果

        QRectF startVal = startValue().toRectF();
        QRectF endVal = endValue().toRectF();
    
        qreal startWidth = startVal.width();
        qreal startHeight = startVal.height();
        qreal endWidth = endVal.width();
        qreal endHeigth = endVal.height();
    
        if (m_path.isEmpty()) {
            QPointF to = endVal.topLeft();
            QPointF from = startVal.topLeft();
            m_path.moveTo(from);
    
            qreal tempWidth = from.rx() - to.rx();
            qreal tempHeight = from.ry() - to.ry();
            QRectF tempRect = QRectF(to.x() - tempWidth, to.y(), tempWidth*2, tempHeight);
            m_path.lineTo(QPointF(from.rx(), from.ry() - tempHeight/2.));
            m_path.arcTo(tempRect, 0, 90);
        }
        int dura = duration();
        const qreal progress = ((dura == 0) ? 1 : ((((currentTime - 1) % dura) + 1) / qreal(dura)));
    
        qreal easedProgress = easingCurve().valueForProgress(progress);
        if (easedProgress > 1.0) {
            easedProgress -= 1.0;
        } else if (easedProgress < 0) {
            easedProgress += 1.0;
        }
        QPointF pt = m_path.pointAtPercent(easedProgress);
    
        QSizeF size = QSizeF(endWidth + startWidth * (1 - easedProgress), endHeigth + startHeight * (1 - easedProgress));
        QRectF retRect = QRectF(pt, size);
        updateCurrentValue(retRect);
        emit valueChanged(retRect);

    调用:

        m_pMyAnmation = new MyAnimation(ui->pushButton, "geometry", this);
        m_pMyAnmation->setDuration(600);
        m_pMyAnmation->setStartValue(QRectF(400, 350, 60, 50));
        m_pMyAnmation->setEndValue(QRectF(200, 100, 0, 0));

    效果

    pos的值采用圆弧曲线的方式,size使用线性的方式,即根据运行百分比获取size的大小

    运行的进度会再根据easingCurve来取值,所以可以使用设置相应的缓动曲线,具体效果看该博客https://blog.csdn.net/a137748099/article/details/107292996

    m_pMyAnmation->setEasingCurve(QEasingCurve::InQuint);

    例子代码下载https://download.csdn.net/download/a137748099/18485759

    参考:Qt官方例子easing

    展开全文
  • 自定义动画—动作路径》教学设计
  • Android自定义曲线路径动画框架

    千次阅读 2016-11-09 22:56:26
    Android自定义曲线路径动画框架最近在一个项目中需要一个像QQ打开个人爱好那样的动画效果如下图:可以看出每个小球都是以顺时针旋转出来的,说明像这样的曲线动画用Android中自带的平移动画是很难实现的。曲线动画怎么...

    原文地址声明:https://blog.csdn.net/qq_23179075/article/details/53107131

    项目地址Github:https://github.com/azhengyongqin/CustomAnimationFramework/tree/master

    最近在一个项目中需要一个像QQ打开个人爱好那样的动画效果如下图:
    在这里插入图片描述

    可以看出每个小球都是以顺时针旋转出来的,说明像这样的曲线动画用Android中自带的平移动画是很难实现的。

    曲线动画怎么画?

    我们先来看看Android自带的绘制曲线的方式是怎样的:
    android自定义View中path常用函数

    1、moveTo()

    moveTo 不会进行绘制,只用于移动移动画笔,也就是确定绘制的起始坐标点。结合以下方法进行使用。

    2、lineTo()

    lineTo() 用于进行直线绘制。

    mPath.lineTo(300, 300);
    canvas.drawPath(mPath, mPaint);
    

    默认从坐标(0,0)开始绘制。如图:
    在这里插入图片描述
    moveTo()是用来移动画笔起点

    mPath.moveTo(100, 100);
    mPath.lineTo(300, 300);
    canvas.drawPath(mPath, mPaint);
    

    把画笔移动(100,100)处开始绘制,效果如图:在这里插入图片描述

    3、quadTo()

    quadTo() 用于绘制圆滑曲线,即贝塞尔曲线
    在这里插入图片描述

    4、cubicTo()

    cubicTo() 同样是用来实现贝塞尔曲线的。mPath.cubicTo(x1, y1, x2, y2, x3, y3) (x1,y1) 为控制点,(x2,y2)为控制点,(x3,y3)为结束点。那么,cubicTo()quadTo() 有什么不一样呢?说白了,就是多了一个控制点而已。然后,我们想绘制和上一个一样的曲线,应该怎么写呢?

    mPath.moveTo(100, 500);
    mPath.cubicTo(100, 500, 300, 100, 600, 500);
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-73Umyowb-1618822329928)(http://i.imgur.com/bWTPsoZ.png)]

    一模一样!如果我们不加 moveTo
    则以(0,0)为起点,(100,500)和(300,100)为控制点绘制贝塞尔曲线:
    在这里插入图片描述

    贝塞尔曲线:

    受到上面的启发,我们也可以用同样的方法来实现一个曲线动画框架
    在写框架之前我们必须要先了解一样东西:

    维基百科地址:https://zh.wikipedia.org/wiki/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A

    那么在上代码之前先看看我们最后实现出来的效果图:
    在这里插入图片描述

    先看看项目整体结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXevbWB8-1618822329933)(http://i.imgur.com/YgRFcbR.png)]

    PathPoint.java中的代码

    /**
     * Created by zhengliang on 2016/10/15 0015.
     * 记录view移动动作的坐标点
     */
    
    public class PathPoint {
        /**
         * 起始点操作
         */
        public static final int MOVE=0;
        /**
         * 直线路径操作
         */
        public static final int LINE=1;
        /**
         * 二阶贝塞尔曲线操作
         */
        public static final int SECOND_CURVE =2;
        /**
         * 三阶贝塞尔曲线操作
         */
        public static final int THIRD_CURVE=3;
        /**
         * View移动到的最终位置
         */
        public float mX,mY;
        /**
         * 控制点
         */
        public float mContorl0X,mContorl0Y;
        public float mContorl1X,mContorl1Y;
        //操作符
        public int mOperation;
    
        /**
         * Line/Move都通过该构造函数来创建
         */
        public PathPoint(int mOperation,float mX, float mY ) {
            this.mX = mX;
            this.mY = mY;
            this.mOperation = mOperation;
        }
    
        /**
         * 二阶贝塞尔曲线
         * @param mX
         * @param mY
         * @param mContorl0X
         * @param mContorl0Y
         */
        public PathPoint(float mContorl0X, float mContorl0Y,float mX, float mY) {
            this.mX = mX;
            this.mY = mY;
            this.mContorl0X = mContorl0X;
            this.mContorl0Y = mContorl0Y;
            this.mOperation = SECOND_CURVE;
        }
    
        /**
         * 三阶贝塞尔曲线
         * @param mContorl0x
         * @param mContorl0Y
         * @param mContorl1x
         * @param mContorl1Y
         * @param mX
         * @param mY
         */
        public PathPoint(float mContorl0x, float mContorl0Y, float mContorl1x, float mContorl1Y,float mX, float mY) {
            this.mX = mX;
            this.mY = mY;
            this.mContorl0X = mContorl0x;
            this.mContorl0Y = mContorl0Y;
            this.mContorl1X = mContorl1x;
            this.mContorl1Y = mContorl1Y;
            this.mOperation = THIRD_CURVE;
        }
    
        /**
         * 为了方便使用都用静态的方法来返回路径点
         */
        public static PathPoint moveTo(float x, float y){
            return new PathPoint(MOVE,x,y);
        }
        public static PathPoint lineTo(float x,float y){
            return  new PathPoint(LINE,x,y);
        }
        public static PathPoint secondBesselCurveTo(float c0X, float c0Y,float x,float y){
            return new PathPoint(c0X,c0Y,x,y);
        }
        public static PathPoint thirdBesselCurveTo(float c0X, float c0Y, float c1X, float c1Y, float x, float y){
            return new PathPoint(c0X,c0Y,c1X,c1Y,x,y);
        }
    }
    
    

    这个类主要是用来记录View移动动作的坐标点,通过不同的构造函数传入不同的参数来区分不同的移动轨迹,注释写的很清楚的…

    为了让不同类型的移动方式都能在使用时一次性使用我写了一个 AnimatorPath类

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    
    /**
     * Created by zhengliang on 2016/10/15 0015.
     * 客户端使用类,记录一系列的不同移动轨迹
     */
    
    public class AnimatorPath {
        //一系列的轨迹记录动作
        private List<PathPoint> mPoints = new ArrayList<>();
    
        /**
         * 移动位置到:
         * @param x
         * @param y
         */
        public void moveTo(float x,float y){
            mPoints.add(PathPoint.moveTo(x,y));
        }
    
        /**
         * 直线移动
         * @param x
         * @param y
         */
        public void lineTo(float x,float y){
            mPoints.add(PathPoint.lineTo(x,y));
        }
    
        /**
         * 二阶贝塞尔曲线移动
         * @param c0X
         * @param c0Y
         * @param x
         * @param y
         */
        public void secondBesselCurveTo(float c0X, float c0Y,float x,float y){
            mPoints.add(PathPoint.secondBesselCurveTo(c0X,c0Y,x,y));
        }
    
        /**
         * 三阶贝塞尔曲线移动
         * @param c0X
         * @param c0Y
         * @param c1X
         * @param c1Y
         * @param x
         * @param y
         */
        public void thirdBesselCurveTo(float c0X, float c0Y, float c1X, float c1Y, float x, float y){
            mPoints.add(PathPoint.thirdBesselCurveTo(c0X,c0Y,c1X,c1Y,x,y));
        }
        /**
         *
         * @return  返回移动动作集合
         */
        public Collection<PathPoint> getPoints(){
            return mPoints;
        }
    }
    
    

    该类是最终在客户端使用的,记录一系列的不同移动轨迹,使用时调用里面的方法就可以添加不同的移动轨迹最后通过getPoints()来得到所有的移动轨迹集合

    在Android自带的绘制曲线的方法中都是只是通过moveTo()方法设置起始点,在其它的方法中只是传入了终点或控制点坐标。实际上我们要画连续的曲线或连续的移动时,都需要知道起点到终点的之间所有的坐标,哪么怎么来的到这些点的坐标?

    Android中为我们提供了一个泛型的接口:TypeEvaluator<T>可以很简单的实现这个难题。这里我就把它叫做"估值器".我们只要创建一个类来实现这个接口,然后通过自己计算公式(就是我们上面的贝塞尔曲线公式)

    下面来看看我项目中的估值器类:PathEvaluator

    
    import android.animation.TypeEvaluator;
    
    /**
     * Created by zhengliang on 2016/10/15 0015.
     * 估值器类,实现坐标点的计算
     */
    
    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);
        }
    }
    

    泛型中传入我们自己的定义的PathPoint类;其实这些复杂的计算代码很简单,就是上面贝塞尔曲线的公式,将需要的点直接带入公式即可,我相信仔细看看会明白的!

    MainActivity中的代码

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private FloatingActionButton fab;
        private AnimatorPath path;//声明动画集合
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            this.fab = (FloatingActionButton) findViewById(R.id.fab);
    
            setPath();
    
            fab.setOnClickListener(this);
        }
        /*设置动画路径*/
        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);
        }
    
        /**
         * 设置动画
         * @param 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);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.fab:
                    startAnimatorPath(fab, "fab", path);
                    break;
            }
        }
    }
    
    

    上面代码中的:setPath()方法根据你自己项目的需要来设置不同的坐标 注意:(“这里的坐标是View以当前位置的偏移坐标,不是绝对坐标”)

    上面代码中的:startAnimatorPath()参数就不介绍了注释中写的很清楚

    ObjectAnimator.ofFloat(view, "scaleX", 0f, 1f).setDuration(500).start();
    

    相信这句代码都能看懂,其中"scaleX"就相当于参数:propertyName

    项目代码中我们传入的参数是:

    startAnimatorPath(fab, "fab", path);
    

    "fab"参数其实对应的就是setFab(PathPoint newLoc)方法,当我们在当前类中定义了该方法,就会自动通过反射的机制来调用该方法!

    看看Xml中的代码

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="zhengliang.com.customanimationframework.MainActivity">
    
        <zhengliang.com.customanimationframework.CustomView.PathView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:targetApi="lollipop" />
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="40dp"
            android:layout_height="40dp"
            />
    </RelativeLayout>
    

    为了可以清晰的看见小球的移动轨迹,自定义了以个View来显示小球的运动轨迹:

    /**
     * 时 间: 2016/11/8 0008
     * 作 者: 郑亮
     * Q  Q : 1023007219
     */
    
    public class PathView extends View {
    
        private Paint paint;
    
    
        public PathView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView();
        }
    
        private void initView() {
            paint = new Paint();
            //抗锯齿
            paint.setAntiAlias(true);
            //防抖动
            paint.setDither(true);
            //设置画笔未实心
            paint.setStyle(Paint.Style.STROKE);
            //设置颜色
            paint.setColor(Color.GREEN);
            //设置画笔宽度
            paint.setStrokeWidth(3);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Path path = new Path();
            path.moveTo(60,60);
            path.lineTo(460,460);
            path.quadTo(660, 260, 860, 460); //订单
            path.cubicTo(160,660,960,1060,260,1260);
            canvas.drawPath(path,paint);
        }
    }
    
    展开全文
  • 在Focusky(也称为“FS软件”)中,除了可以应用软件里自带的动画效果,如进入特效,强调特效,退出特效,还可以自定义一个对象由一个点按照一定的轨迹运动到另一点。 操作步骤如下: 1.点击“动画”进入动画编辑...

    Focusky(也称为“FS软件”)中,除了可以应用软件里自带的动画效果,如进入特效,强调特效,退出特效,还可以自定义一个对象由一个点按照一定的轨迹运动到另一点。

    操作步骤如下:

    1.点击“动画”进入动画编辑页面。(如图1)
    在这里插入图片描述
    【图1▲】(Focusky教程)

    2.单击需添加路径的物体,依次点击添加“动画—>-动作路径—>自定义路径 ”按钮,开始自定义编辑。(如图2)
    在这里插入图片描述
    【图2▲】(Focusky教程)

    3.在右侧边栏中勾选显示动作路径即可编辑。(如图3)

    【添加节点】按住ctrl 键,在线上或在空白处点击鼠标左键添加节点
    【删除节点】按住ctrl 键,在节点上点击鼠标左键以删除该节点
    【调整节点】按住alt键,点击并拖动节点以调节控制点
    在这里插入图片描述
    【图3▲】(Focusky教程)

    4.单击预览按钮预览效果;之后单击“退出动画编辑”按钮保存当前设置即可。(如图4)
    在这里插入图片描述
    【图4▲】(Focusky教程)

    展开全文
  • UIButton自定义路径动画

    千次阅读 2016-03-14 23:53:18
    之前看了一个别人做的汉堡动画的动效,非常有意思,然后在花瓣网上找了一个差不多的,自己尝试着做了一下。花瓣网上找的动效 最终代码实现的效果 https://github.com/BearRan/CheckBtnAnimation 说一下,这个动效...
  • 本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 然后单击“自定义动画”按钮,在窗口的右边会出现“自定义动画”窗格。  第3步,单击“添加效果”按钮,选杼“强凋”。在展开的菜单中选择一种强调效果,如“放大/缩小”,如图2所示。  第4步,在“自定义...
  • PPT动画教程自定义路径。PPT动画的真正精髓是自定义路径。第一步:先为对象添加一个路径动画,在导航栏上切换为自定义路径。第二步:像描绘自定义形状一样描绘路径,按下回车键,形成自定义路径。第三步:点击该路径...
  • 利用动作路径自定义元素对象的位移变化、位置变动、大小缩放、曲线运动等,增强动画视频的画面感、趣味性和形象性。 动画移动路径预览: 万彩手影大师支持轻松自定义元素动画的移动路径,具体操作如下: 一、...
  • Carousel-开源3d,自定义路径动画,可以自行修改panel模式
  • 如何在Canvas中实现自定义路径动画

    千次阅读 2017-09-17 17:49:46
    在最近的项目中笔者需要做一个新需求:在canvas中实现自定义路径动画。这里所谓的自定义路径不单单包括一条直线,也许是多条直线的运动组合,甚至还包含了贝塞尔曲线,因此,这个动画也许是下面这个样子的: 那么...
  • 通过css属性offset-path可以指定元素不规则的动画路径 动画元素需绝对定位 position: absolute; 不规则的动画路径参数获取方法 通过网站http://svg.wxeditor.com/绘制好想要的不规则的动画路径后,按Ctrl+U可以...
  • 1、在幻灯片中选择对象,在“动画”选项卡的“高级动画”组中单击“添加动画”按钮,在打开的下拉列表中选择“自定义路径”选项,如图1所示。 图1 选择“自定义路径”选项 2、此时鼠标指针变为十字形,在...
  • android自定义路径的属性动画

    千次阅读 2016-11-09 20:50:44
    参考: 安卓开发之实现控件的贝塞尔曲线路径动画 android 路径动画制作 把商品添加到购物车的动画效果(贝塞尔曲线)
  • 自定义动画Animation

    2016-05-12 15:32:32
    创建自定义动画非常简单,只要实现他的applyTransformation的逻辑就可以了,不过通常情况下还要覆盖父类的initialize方法来实现一些初始化工作。 模拟电视机关闭效果动画import android.graphics.Camera; import ...
  • PPT动画教程:进入退出动画、插入背景音乐、幻灯片切换、自定义路径等操作效果演示
  • jQuer中animate() 方法用于创建自定义动画,语法为: animate({params},speed,callback); 其中params为必须属性,其它两个则为可选的属性。 params参数定义形成动画的 CSS 属性,即直接写元素的CSS属性; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,546
精华内容 15,818
关键字:

怎么设置自定义动画路径