javafx动画

到目前为止,尽管我的大多数文章都涉及JavaFX属性和绑定,但是今天我想写一讲我也致力于JavaFX运行时的另一部分:动画API。

在本文中,我将解释如何在JavaFX中编写自定义动画,以及如何使用这种方法为Sprite动画创建类。 (这对于我在第33次会议上的会议来说也是一种好习惯。我计划在短短一个小时内用JavaFX编写一个游戏。这将很有趣!)

运动中的马

有很多非常好的文章描述了预定义的过渡(TranslateTransition,RotateTransition等)和时间表。 在大多数情况下,这些方法已足够,但在某些情况下,仅需要更大的灵活性。 这就是Transition类开始起作用的时候,可以扩展该类以定义自定义动画。
要通过扩展Transition编写自己的动画类,需要两个步骤:

  1. 指定一个周期的持续时间
  2. 实现interpolate()方法

一个周期的持续时间

您可以通过调用受保护的方法setCycleDuration()来设置周期的持续时间。 在大多数情况下,持续时间是固定的(如果动画仅使用一次)或可由用户配置。 JavaFX运行时中几乎所有预定义的转换都属于第二类。 它们通过duration属性公开其循环持续时间,您可能也想在您的课程中做到这一点。 在极少数情况下,循环的持续时间取决于其他值。 例如,SequentialTransition和ParallelTransition的持续时间取决于其子代的持续时间。
您可以随意更改循环持续时间,但是请注意,它不会影响当前正在运行的动画。 只有在动画停止并重新开始之后,才考虑新的循环持续时间。

interpolate()方法

interpolate()方法是抽象的,需要重写。 它定义了动画的实际行为。 播放动画时,运行时会在每帧中调用interpolate()方法。 传入值frac,0.0到1.0之间的双精度值(包括两端值),用于指定当前位置。 值0.0表示动画的开始,值1.0表示动画的结束。 之间的任何值都定义相对位置。 请注意,在计算frac的值时已经考虑了可能的内插器。

类SpriteAnimation

为了演示如何定义自定义过渡,我们将看一个允许我们制作Sprite动画的类。 它会拍摄具有几帧的图像,然后将视口随时间从一帧移到另一帧。 我们将通过Eadweard Muybridge着名的“运动中的马”来测试这一节课。 聊够了,这里是代码:

package sandboxfx;import javafx.animation.Interpolator;
import javafx.animation.Transition;
import javafx.geometry.Rectangle2D;
import javafx.scene.image.ImageView;
import javafx.util.Duration;public class SpriteAnimation extends Transition {private final ImageView imageView;private final int count;private final int columns;private final int offsetX;private final int offsetY;private final int width;private final int height;private int lastIndex;public SpriteAnimation(ImageView imageView, Duration duration, int count,   int columns,int offsetX, int offsetY,int width,   int height) {this.imageView = imageView;this.count     = count;this.columns   = columns;this.offsetX   = offsetX;this.offsetY   = offsetY;this.width     = width;this.height    = height;setCycleDuration(duration);setInterpolator(Interpolator.LINEAR);}protected void interpolate(double k) {final int index = Math.min((int) Math.floor(k * count), count - 1);if (index != lastIndex) {final int x = (index % columns) * width  + offsetX;final int y = (index / columns) * height + offsetY;imageView.setViewport(new Rectangle2D(x, y, width, height));lastIndex = index;}}
}
清单1:SpriteAnimation类

为了简单起见,此示例类仅接受构造函数中的所有参数,不允许以后更改它们。 在大多数情况下,这就足够了。
该类需要一个ImageView,一个周期的持续时间(即遍历所有帧应花费的时间),帧数,列数(图像中的一行中有多少帧),第一帧的偏移量以及所有帧的宽度和高度。 通过调用setCycleDuration()将整个周期的持续时间传递给超类,并存储所有其他值。 作为构造函数的最后一步,将内插器设置为线性。 默认情况下,将为所有过渡设置缓动插值器,因为通常这是最好的结果。 但是在我们的例子中,我们希望以相同的速度遍历所有帧,并且缓和插值器看起来很奇怪。
interpolate()方法采用传入的值并计算当前需要显示的帧。 如果自上次调用interpolate()以来它发生了变化,则将计算新帧的位置,并相应地设置ImageView的视口。 而已。

运动中的马

为了演示SpriteAnimation类,我们将对“运动中的马”进行动画处理。 这样做的代码很简单,大多数工作已经完成。 它创建一个将视口设置为第一帧的ImageView,并实例化SpriteAnimation类。 参数仅是估计值,您可能需要对其进行一些调整。

package sandboxfx;import javafx.animation.Animation;
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.util.Duration;public class SandboxFX extends Application {private static final Image IMAGE = new Image("http://upload.wikimedia.org/wikipedia/commons/7/73/The_Horse_in_Motion.jpg");private static final int COLUMNS  =   4;private static final int COUNT    =  10;private static final int OFFSET_X =  18;private static final int OFFSET_Y =  25;private static final int WIDTH    = 374;private static final int HEIGHT   = 243;public static void main(String[] args) {launch(args);}public void start(Stage primaryStage) {primaryStage.setTitle("The Horse in Motion");final ImageView imageView = new ImageView(IMAGE);imageView.setViewport(new Rectangle2D(OFFSET_X, OFFSET_Y, WIDTH, HEIGHT));final Animation animation = new SpriteAnimation(imageView,Duration.millis(1000),COUNT, COLUMNS,OFFSET_X, OFFSET_Y,WIDTH, HEIGHT);animation.setCycleCount(Animation.INDEFINITE);animation.play();primaryStage.setScene(new Scene(new Group(imageView)));primaryStage.show();}
}
清单2:JavaFX推动发展

结论

通过扩展Transition类来定义自己的动画非常简单明了。 但是,这是一种非常强大的方法,因为以这种方式创建的动画具有常规动画具有的所有功能。 例如,您可以通过更改速率来越来越慢地播放它,甚至可以向后播放它。 您可以循环运行它,也可以在ParallelTransition和SequentialTransition中使用它来创建更复杂的动画。

参考: JCG合作伙伴 Michael Heinrichs 使用JavaFX创建Sprite动画   在Mike的Blog上 。

翻译自: https://www.javacodegeeks.com/2012/03/javafx-creating-sprite-animation.html

javafx动画

javafx动画_JavaFX:创建Sprite动画相关推荐

  1. JavaFX:创建Sprite动画

    到目前为止,尽管我的大多数文章都涉及JavaFX属性和绑定,但今天我想写一讲我也致力于JavaFX运行时的另一部分:动画API. 在本文中,我将解释如何在JavaFX中编写自定义动画,以及如何使用这种 ...

  2. UE4-(蓝图)第四十四课过场动画之创建及动画添加

    一.主序列.关卡序列.子序列之间的不同 区别在于他们的使用方法和组织结构,主序列包含关卡序列的子序列,就好比主序列是一个盒子,装满了包含其他内容的盒子,你可以移动大盒子里面的小盒子,主序列就是一个容器 ...

  3. M8SDK教程-游戏开发心得(三):DDraw进阶教程-贴图,Alpha和Sprite动画,RPG游戏雏形

    M8SDK教程-游戏开发心得(三):DDraw进阶教程-贴图,Alpha和Sprite动画,RPG游戏雏形 引用: M8 SDK教程- 游戏开发心得(一): 游戏程序框架 http://bbs.mei ...

  4. Android动画之帧动画和补间动画

    Android系统提供三种动画:帧动画.补间动画和属性动画.这里先分析总结帧动画和补间动画. FrameAnimation 帧动画,通俗来说就是按照图片动作顺序依次播放来形成动画,创建帧动画可以用 x ...

  5. Unity2D之Sprite动画相关

    [Unity2D]精灵动画   通常我们在游戏里面创建的精灵比如玩家主角,它在移动的过程中一般会带有一些动画的效果,比如两只脚前后地移动,那么这种动画效果的实现和控制就可以通过Unity2D的动画系统 ...

  6. 关于Unity如何创建静态动画图片

    1.先创建一个UI--Image图片 2.选中这个图片,选择Window窗口下的Animation 3.然后点击创建一个新的Animation动画片段(会自动生成相应的动画机,名字为物体名) 4.点击 ...

  7. Unity 2D 学习手札(六)Sprite 动画

    简单的范例 如上图,在等待使用者作答时,播放左右晃头的等待动画,使用者作答时,判断答对或答错,分别播放不同的动画及音效.播放完毕,继续左右晃头. 图片制作 左右晃头要准备三个状态的图,分别为摆左.正中 ...

  8. Unity中Animation动画的创建

    记录下关于Animation的学习: 1.首次创建Animation动画: (1) 把Sprite直接拖到Hierarchy面板: (2) 选中拖上去的Sprite,然后Windows->Ani ...

  9. VB6编程:DirectX 2D图形学习日志22创建卡通动画

    VB6编程:DirectX 2D图形学习日志22创建卡通动画 教程下载地址:https://download.csdn.net/download/gosub60/13696651 作用:使用多幅BMP ...

最新文章

  1. 吵翻了!AI 顶会设置媒体静默期,作者不信邪提前宣传被拒稿,加强盲审是促进公平还是阻止了学术交流?...
  2. (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义03--对象的生命周期--构造函数和析构函数...
  3. windows远程修改密码
  4. python 面试题 博客园_python面试题
  5. 网页的js源文件被加密解决方案
  6. expected at least 1 bean which qualifies as autowire candidate. Dependency a...
  7. Python+django建站入门篇:Hello world
  8. 爬虫python能做什么-Python 爬虫学到什么样就可以找工作了?
  9. flume介绍及应用
  10. 军工产品检验标准有哪些?军工产品检测机构报告
  11. HTML5从入门到精通
  12. 阿里云服务器搭建k8s
  13. html旋转360度特效,CSS3图片旋转特效(360/60/-360度)?
  14. 微信开发者工具调试H5项目报错:XXXXfail, the permission value is offline verifying解决方案
  15. android 英语单词音标获取
  16. 几何学五大公理_数学几何的五大公理、五大公设是什么?
  17. 请问:现正在广告上的丰胸产物是不是实的?
  18. 竖流式沉淀池三角堰计算_竖流式沉淀池设计计算
  19. 27习题幼儿园买玩具
  20. 华为手机备份app从内部恢复

热门文章

  1. [编程入门]宏定义的练习:输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
  2. 《狂人日记》金句摘抄(一)
  3. ssm(Spring+Spring mvc+mybatis)Service层接口——IDeptService
  4. Mybatis中使用Dao实现类实现增删改查【实际开发中使用代理dao】
  5. mysql中select语句子句,了解mysql中select语句操作实例
  6. 炒菜机器人的弊端_机器人炒菜真不是你想的那样!
  7. ogm neo4j_Neo4J OGM与Quarkus
  8. 朝着理想坚实迈进_坚实原则:单一责任原则
  9. java登录界面命令_Java命令行界面(第30部分):观察
  10. sap界面功能_功能介面