javafx实现图片3D翻转效果方法实例

 更新时间:2013年04月17日 11:28:11   转载 作者:  
程序实现思路: 在javafx中Node对象有一个effect属性,可以用于实现各种特效。PerspectiveTransform特效可以使Node对象实现透视变换。因此我们可以通过计算透视变换中每个点的位置来实现3D翻转特效。

实现步骤: 1、定义FlipView对象。包含以下属性:

复制代码 代码如下:

    //正面视图
public Node frontNode;
//反面视图
public Node backNode;
//是否翻转
boolean flipped = false;
//翻转角度
DoubleProperty time = new SimpleDoubleProperty(Math.PI / 2);
//正面翻转特效
PerspectiveTransform frontEffect = new PerspectiveTransform();
//反面翻转特效
PerspectiveTransform backEffect = new PerspectiveTransform();

 create方法返回需要显示的内容:

复制代码 代码如下:

private void create() {
        time.addListener(new ChangeListener() {
            @Override
            public void changed(ObservableValue<? extends Number> arg0,
                    Number arg1, Number arg2) {
                setPT(frontEffect, time.get());
                setPT(backEffect, time.get());
            }
        });
        anim.getKeyFrames().addAll(frame1, frame2);
        backNode.visibleProperty().bind(
                Bindings.when(time.lessThan(0)).then(true).otherwise(false));

        frontNode.visibleProperty().bind(
                Bindings.when(time.lessThan(0)).then(false).otherwise(true));
        setPT(frontEffect, time.get());
        setPT(backEffect, time.get());
        frontNode.setEffect(frontEffect);
        backNode.setEffect(backEffect);
        getChildren().addAll(backNode, frontNode);
    }

以上代码需要注意的是: 随着time值的变化frontEffect和backEffect的值也会随着变换。 2、PerspectiveTransform特效的实现使用了Math.sin()和Math.cos()方法模拟3D角度变换。 具体实现如下:
复制代码 代码如下:

private void setPT(PerspectiveTransform pt, double t) {
        double width = 200;
        double height = 200;
        double radius = width / 2;
        double back = height / 10;
        pt.setUlx(radius - Math.sin(t) * radius);
        pt.setUly(0 - Math.cos(t) * back);
        pt.setUrx(radius + Math.sin(t) * radius);
        pt.setUry(0 + Math.cos(t) * back);
        pt.setLrx(radius + Math.sin(t) * radius);
        pt.setLry(height - Math.cos(t) * back);
        pt.setLlx(radius - Math.sin(t) * radius);
        pt.setLly(height + Math.cos(t) * back);
    }

3、角度变换在1秒的时间内从3.14/2变换到-3.14/2。
复制代码 代码如下:

KeyFrame frame1 = new KeyFrame(Duration.ZERO, new KeyValue(time,
            Math.PI / 2, Interpolator.LINEAR));
    KeyFrame frame2 = new KeyFrame(Duration.seconds(1),
            new EventHandler() {
                @Override
                public void handle(ActionEvent event) {
                    flipped = !flipped;
                }
            }, new KeyValue(time, -Math.PI / 2, Interpolator.LINEAR));

 4、FlipView对象的创建:通过构造函数可以很方便的创建FlipView对象.

复制代码 代码如下:

ImageView image1 = new ImageView(new Image(getClass()
                .getResourceAsStream("lion1.png")));
ImageView image2 = new ImageView(new Image(getClass()
                .getResourceAsStream("lion2.png")));
FlipView flip = new FlipView(image1, image2);

 5、效果图:

相关文章

  • 解决Eclipse add external jars运行出现java.lang.NoClassDefFoundError的方法

    解决Eclipse add external jars运行出现java.lang.NoClassDefFou

    本篇文章对Eclipse add external jars导致运行出现java.lang.NoClassDefFoundError的解决方法进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • Java Lambda表达式与匿名内部类的联系和区别实例分析

    Java Lambda表达式与匿名内部类的联系和区别实例分析

    这篇文章主要介绍了Java Lambda表达式与匿名内部类的联系和区别,结合实例形式分析了Java Lambda表达式与匿名内部类功能、用法、区别及操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Java关于jar包的知识详解

    Java关于jar包的知识详解

    这篇文章主要介绍了Java关于jar包的知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java模拟实现QQ三方登录(单点登录2.0)

    Java模拟实现QQ三方登录(单点登录2.0)

    这篇文章主要为大家详细介绍了Java模拟实现QQ三方登录,单点登录2.0,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Spring Boot Cache使用方法整合代码实例

    Spring Boot Cache使用方法整合代码实例

    这篇文章主要介绍了Spring Boot Cache使用方法整合代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java保留两位小数的几种写法总结

    Java保留两位小数的几种写法总结

    相信大家在平时做项目时,可能会有这样的业务需求: 页面或界面上展示的数据保留小数点后两位。 那么这篇文章小编就和大家分享了利用Java保留两位小数的几种写法,文章给出了详细的示例代码,对大家的学习和理解很有帮助,有需要的朋友们下面来一起学习学习下吧。
    2016-11-11
  • 老生常谈反射之Class类的使用(必看篇)

    老生常谈反射之Class类的使用(必看篇)

    下面小编就为大家带一篇老生常谈反射之Class类的使用(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Spring 项目常用pom文件的依赖

    Spring 项目常用pom文件的依赖

    这篇文章主要介绍了Spring 项目常用pom文件的依赖,文中给大家提到了Spring boot starter pom的依赖关系说明,需要的朋友参考下吧
    2018-03-03
  • Spring MVC获取查询参数及路径参数代码实例

    Spring MVC获取查询参数及路径参数代码实例

    这篇文章主要介绍了Spring MVC获取查询参数及路径参数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java Swing JComboBox下拉列表框的示例代码

    Java Swing JComboBox下拉列表框的示例代码

    这篇文章主要介绍了Java Swing JComboBox下拉列表框的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论