博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javafx实现一个很有意思的动画
阅读量:4961 次
发布时间:2019-06-12

本文共 2183 字,大约阅读时间需要 7 分钟。

 说明:

动画中所有眼睛会随着橙色小球的移动而移动。

1、动画实现

 javafx中动画实现相当简单。(不会的同学赶紧上手学习吧,很简单的^_^)

该动画中用到PathTransition类,用于定义小球移动轨迹。

然后分别用DoubleProperty对象bind小球的translateXProperty和translateYProperty

最后添加DoubleProperty对象的ChangeListener事件,当小球的位置发生变化时更新所有眼睛的眼球位置。

在线运行:

先贴图看看效果^_^

 

编码实现:

1、眼睛设计。

从图中可以很容易的发现,单眼睛由一个椭圆和一个小圆构成。

因此设计Eye类,包含两个成员变量Circle eye(眼球)和Ellipse ellipse(眼眶)

眼眶的位置是固定的,关键是眼球的位置的计算。

首先,我们需要计算目标位置和ellipse的圆心的连线的水平角度。

然后,我们可以通过ellipse的水平半径和该角度的余弦值计算eye的x坐标。

        通过ellipse的垂直半径和该角度的正弦值计算eye的y坐标

最后,纠正以上计算出来的坐标。(如果目标位置在眼睛里面,那么眼球的位置就是目标位置)

以下代码用javafx2.*版本实现:

public class Eye extends Parent {    public static final double CENTER_X = 42.5;    public static final double CENTER_Y = 62.5;    public static final double ELLIPSE_RADIUS_X = 40d;    public static final double ELLIPSE_RADIUS_Y = 60d;    private Circle eye;    private Ellipse ellipse;    public Eye() {        create();    }    private void create() {        // 设置椭圆:CENTER_X,CENTER_Y表示椭圆圆点位置,ELLIPSE_RADIUS_X,ELLIPSE_RADIUS_Y表示椭圆长、短轴半径        ellipse = new Ellipse(CENTER_X, CENTER_Y, ELLIPSE_RADIUS_X,                ELLIPSE_RADIUS_Y);        ellipse.setStrokeWidth(5.0);        ellipse.setStroke(Color.BLACK);        ellipse.setFill(null);        // 设置圆:CENTER_X,CENTER_Y表示圆圆点位置        eye = new Circle(CENTER_X, CENTER_Y, 10d, Color.BLACK);        this.getChildren().addAll(ellipse, eye);    }    public void updateMousePosition(double mouseX, double mouseY) {        double localMouseX = mouseX - CENTER_X;        double localMouseY = mouseY - CENTER_Y;        // 计算目标位置与点(CENTER_X,CENTER_Y)连线的水平角度        double angle = Math.atan2(localMouseY, localMouseX);        // 7.5为椭圆strokeWidth/2+圆radius/2(保证eye在ellipse里面)        double eyeX = (ELLIPSE_RADIUS_X - 7.5) * Math.cos(angle);        // 鼠标在ellipse里面时eye位置为鼠标位置        if (Math.abs(localMouseX) < Math.abs(eyeX)) {            eyeX = localMouseX;        }        double eyeY = (ELLIPSE_RADIUS_Y - 7.5) * Math.sin(angle);        if (Math.abs(localMouseY) < Math.abs(eyeY)) {            eyeY = localMouseY;        }        eye.setCenterX(eyeX + CENTER_X);        eye.setCenterY(eyeY + CENTER_Y);    }}

确实很简单,赶快下载源代码看看效果吧。

 

转载于:https://www.cnblogs.com/javafx/archive/2013/03/27/2983280.html

你可能感兴趣的文章
函数装饰器与类装饰器
查看>>
sql 增删改查等语句
查看>>
Xen虚拟机磁盘镜像模板制作(四)—CentOS 7
查看>>
【洛谷】3402:【模板】可持久化并查集
查看>>
python第15天
查看>>
ueditor1_4_3-utf8-jsp配置及自定义,结合struts2
查看>>
PHPMyAdmin在Window下的安装
查看>>
Eclipse 批量创建多级文件夹
查看>>
用console.log分析Vue源码
查看>>
java抽象类与接口
查看>>
Vue仿string.format
查看>>
C#读取大文件
查看>>
Dubbo学习-2-注册中心搭建
查看>>
ANSIToMultiByteUTF8的跨平台实现
查看>>
(专题一)02 matlab数值数据的表示方法,输出数据以及相关函数
查看>>
通过WebService获取归属地查询
查看>>
求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)
查看>>
Mysql数据库查询优化日常笔记
查看>>
javascript 引擎实现机制 集合
查看>>
测试下载链接
查看>>