|
package javafxapplication26;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.animation.Timeline;
import javafx.animation.KeyFrame;
import javafx.animation.Interpolator;
import javafx.scene.Group;
import java.lang.Math.*;
import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.Stop;
/**
* @author Administrator
*/
var yoffset = 65;
var dist = 50;
var dx = 0;
var dw:Number = 50;
var dh:Number = 20;
var dh2:Number = 0;
var dh2_target1:Number;
var dh2_target2:Number;
var dh2_target3:Number;
var index = 13;
var images:Image[] = [];
var isRight:Boolean = true;
var count = 0;
var target:Integer;
var g:Group;
for (i in[1..14]) insert Image { url: "{__DIR__}images/img{i}.jpg" } into images;
var tl:Timeline;
function makeMove():Void {
tl = Timeline {
repeatCount: bind count
keyFrames : [
at(0s) {
dx => 0 tween Interpolator.EASEIN;
dw => 50 tween Interpolator.EASEIN;
dh => 20 tween Interpolator.EASEIN;
dh2 => dh2_target1 tween Interpolator.EASEIN;
}
at(10s) {
dx => target/3 tween Interpolator.EASEIN;
dw => 17 tween Interpolator.EASEIN;
dh => 7 tween Interpolator.EASEIN;
dh2 => dh2_target2 tween Interpolator.EASEIN
}
at(20s) {
dx => target tween Interpolator.EASEIN;
dw => 0 tween Interpolator.EASEIN;
dh => 0 tween Interpolator.EASEIN;
dh2 => dh2_target3 tween Interpolator.EASEIN;
}
KeyFrame {
time : 21s
action: function () {
if(isRight) index --
else index ++;
dx = 0;
dw = 50;
dh = 20;
dh2 = dh2_target1;
Id = 0;
}
}
]
};
tl.play();
}
var Id:Integer;
function actionPerformed(id:String):Void{
if(Id == -1 or tl.running) return;
Id = Integer.parseInt(id);
if(Id>4) {
isRight = true;
target = dist;
dh2_target1 = 0;
dh2_target2 = 30;
dh2_target3 = 20;
} else if(Id<4) {
isRight = false;
target = -dist;
dh2_target1 = 20;
dh2_target2 = 30;
dh2_target3 = 0;
}
count = abs(Id-4);
Id = -1;
makeMove();
}
Stage {
title: "Cover Flow 效果"
scene: Scene {
width: 700
height:340
content: [
Rectangle {
x: 0, y: 0
width: 700, height: 340
fill: RadialGradient {
centerX: 350
centerY: 170
radius: 180
proportional: false
stops: [
Stop {
color : Color.web("#141aa2")
offset: 0.0
},
Stop {
color : Color.web("#06012a")
offset: 1.0
},
]
}
stroke: null
},
g = Group {
clip: Rectangle {
x: 50, y: -30
width: 12*dist, height: 350
}
translateY: yoffset
content: [
for (i in [8..6 step -1])
Positioner {
Id: "{i}"
offsetX: bind (7 - i)*dist + dx
image: bind images[index-i]
action: actionPerformed
},
Positioner {
Id: "5"
offsetX: bind if(isRight) 2*dist + 3*dx else 2*dist + dx
image: bind images[index-5]
dw: bind if(isRight) dw else 50
dh: bind if(isRight) dh else 20
action: actionPerformed
},
Positioner {
Id: "4"
offsetX: bind 5*dist + 3*dx
image: bind images[index-4]
dw: bind if(isRight) 3*(50 - dw) else 50 - dw
dh: bind if(isRight) dh2 else 20 - dh
},
Positioner {
Id: "3"
offsetX: bind if(isRight) 8*dist + dx else 8*dist + 3*dx
image: bind images[index-3]
dw: bind if(isRight) 150 else 3*dw
dh: bind if(isRight) 20 else dh2
action: actionPerformed
},
for (i in [2..0 step -1])
Positioner {
Id: "{i}"
offsetX: bind (11 - i)*dist + dx
image: bind images[index-i]
dw: 150
action: actionPerformed
},
]
}
]
}
}
g.content[4..] = reverse g.content[4..];
import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.scene.input.MouseEvent;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
/**
* @author Administrator
*/
// place your code here
public class Positioner extends CustomNode {
package var offsetX:Number;
package var image:Image;
package var dw:Number = 50;
package var dh:Number = 20;
package var sx:Number = 1;
package var sy:Number = 1;
package var Id:String;
package var action:function(:String):Void;
override function create():Node {
Group {
translateX: bind offsetX
content:[
Group {
effect: bind if(image == null) null else
PerspectiveTransform {
ulx:bind dw
uly:bind -dh
urx:bind 200 - dw
ury:bind dh
lrx:bind 200 - dw
lry:bind 400 - 3*dh
llx:bind dw
lly:bind 400 + 3*dh
}
content: bind if(image == null) null else [
ImageView {
x:0 y:0
image: bind image
onMouseReleased: function (e: MouseEvent): Void {
action(this.Id);
}
},
Text {
font : Font {
size: 14
name: "Times New Roman Bold"
}
x: 10, y: 30
content: "{Id}"
},
ImageView {
scaleY:-1.0
x:0 y:200
image: bind image
},
Rectangle {
x: 0, y: 200
width: 200, height: 200
fill: LinearGradient {
startX : 0
startY : 0.0
endX : 0
endY : 1
stops: [
Stop {
color : Color.rgb(1, 2, 28, 0.5)
offset: 0.0
},
Stop {
color : Color.rgb(1, 2, 28, 0.87)
offset: 0.25
},
]
}
}
]
}
]
}
}
}
|