博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javafx实现图片3D翻转效果
阅读量:4955 次
发布时间:2019-06-12

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

程序实现思路: 在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
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、效果图:

 

转载于:https://www.cnblogs.com/javafx/archive/2013/04/17/3025794.html

你可能感兴趣的文章
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>
Scrapy入门程序点评
查看>>
DotNetty网络通信框架学习之源码分析
查看>>
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>
Qt中图像的显示与基本操作
查看>>
详解软件工程之软件测试
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
java小技巧
查看>>