2013年(92)
分类: 信息化
2013-04-19 05:35:34
程序完结思路: 在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、效果图: 在线工作 源码下载 ?