JavaFx实现-渐变效果之一

时间:2022-07-26 17:03:53

自从JavaOne大会推出JavaFX后,我一直比较关注这个项目,它是一种利用Java的脚本技术,功能上近似于Flash。 它的优势在于,Flash虽有很好的功能和普及度,但它永远不能交付Java类库的大部分功能,而 JavaFX可以。因为也给了JavaFX一个“可能性”上的生存空间。

JavaFx实现-渐变效果之一

但是由于JavaFX推出的太晚,兼之文档较少,很多人还是对其望而止步,干等下去也不是办法。所以我最近空闲时会写一些JavaFX的小例子以作练习之用。

JavaFx实现-渐变效果之一import  javafx.ui. * ;
JavaFx实现-渐变效果之一
import  javafx.ui.canvas. * ;
JavaFx实现-渐变效果之一
// 圆点渐变过滤器
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一
class  CircleTransition  extends  CompositeNode  ... {
JavaFx实现-渐变效果之一  
//设定参数项 变量名:类型
JavaFx实现-渐变效果之一
    attribute r: Number;
JavaFx实现-渐变效果之一    attribute d: Number;
JavaFx实现-渐变效果之一    attribute w: Number;
JavaFx实现-渐变效果之一    attribute h: Number;
JavaFx实现-渐变效果之一    attribute xp: Number;
JavaFx实现-渐变效果之一    attribute img: Image;
JavaFx实现-渐变效果之一}

JavaFx实现-渐变效果之一
// 为参数赋值
JavaFx实现-渐变效果之一
attribute CircleTransition.r   =   - 45 ;
JavaFx实现-渐变效果之一attribute CircleTransition.d  
=   16 ;
JavaFx实现-渐变效果之一attribute CircleTransition.w  
=   320 ;
JavaFx实现-渐变效果之一attribute CircleTransition.h  
=   240 ;
JavaFx实现-渐变效果之一attribute CircleTransition.xp 
=   - w;
JavaFx实现-渐变效果之一
// 注入过滤器参数
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一
function CircleTransition.composeNode()  =  Group  ... {
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一  content:[Clip 
...{
JavaFx实现-渐变效果之一  
//注入shape
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一
    shape: Rect ...{ x:0, y:0, width:w, height:h },
JavaFx实现-渐变效果之一    
//设定偏移
JavaFx实现-渐变效果之一
    transform: translate(1040),
JavaFx实现-渐变效果之一    
//注入Group
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一
    content: Group ...{
JavaFx实现-渐变效果之一    
//加载ImageView用以显示图像
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一
      content: [ImageView ...{
JavaFx实现-渐变效果之一        transform: translate(
-60-30),
JavaFx实现-渐变效果之一        image: 
this.img,
JavaFx实现-渐变效果之一        
//分段绘制图像
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一
      }
, Subtract ...{
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一        shape1: Rect 
...{ x:0, y:0, width:w*4, height:h*4 },
JavaFx实现-渐变效果之一        fill:orange,
JavaFx实现-渐变效果之一        
//bind
JavaFx实现-渐变效果之一
        transform: bind [rotate(r, 0, h), translate(-w+xp, 0)],
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一        shape2: Union 
...{
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一          content: [foreach (j in [
0..w/d], i in [0..h/d*2]) Circle ...{
JavaFx实现-渐变效果之一            radius: j,
JavaFx实现-渐变效果之一            cx: w
-j*d,
JavaFx实现-渐变效果之一            cy: i
*d,
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一          }
, Rect ...{
JavaFx实现-渐变效果之一            x:
-w, y:0, width:w+w/2, height:h*2,
JavaFx实现-渐变效果之一          }
]
JavaFx实现-渐变效果之一        }

JavaFx实现-渐变效果之一      }
],
JavaFx实现-渐变效果之一    }

JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一  }
, View ...{
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一    content: GroupPanel 
...{
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一     var row 
= Row ...{alignment: BASELINE}
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一     var column1 
= Column ...{}
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一     var column2 
= Column ...{}
JavaFx实现-渐变效果之一     
//鼠标设为默认
JavaFx实现-渐变效果之一
      cursor: DEFAULT
JavaFx实现-渐变效果之一      rows: [row]
JavaFx实现-渐变效果之一      columns: [column1, column2]
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一      content: [SimpleLabel 
...{
JavaFx实现-渐变效果之一        row: row
JavaFx实现-渐变效果之一        column: column1
JavaFx实现-渐变效果之一        text: 
"操作:"
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一      }
, Button ...{
JavaFx实现-渐变效果之一        row: row
JavaFx实现-渐变效果之一        column: column2
JavaFx实现-渐变效果之一        opaque: 
false
JavaFx实现-渐变效果之一        mnemonic: T
JavaFx实现-渐变效果之一        text: 
"变更图像"
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一        action: operation() 
...{
JavaFx实现-渐变效果之一            xp 
= [0,d..w*2] dur 2000;
JavaFx实现-渐变效果之一        }

JavaFx实现-渐变效果之一      }
]
JavaFx实现-渐变效果之一    }

JavaFx实现-渐变效果之一  }

JavaFx实现-渐变效果之一]}
;
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一Frame 
... {
JavaFx实现-渐变效果之一  title  : 
"JavaFX - 图像渐变效果1"
JavaFx实现-渐变效果之一  width  : 
350
JavaFx实现-渐变效果之一  height : 
350
JavaFx实现-渐变效果之一JavaFx实现-渐变效果之一  content: Canvas 
...{ content: CircleTransition...{img: ...{ url: "image.jpg" }} }
JavaFx实现-渐变效果之一  centerOnScreen: 
true
JavaFx实现-渐变效果之一  visible: 
true
JavaFx实现-渐变效果之一}
;
 
JavaFx实现-渐变效果之一

效果图:
JavaFx实现-渐变效果之一

第一次写代码的感觉就是效率太慢……

由解释到执行的效率比Swing还不能令人忍受(当然,有代码优化的余地,但还是太慢)

且抛去效率问题不提,桌面JavaFX现在还有一个比较关键的问题,那就是如何部署。对于从前没有安装过JRE的用户来说,JRE体积太大,而且现在从浏览器上进行按需安装(如使用Java Start Web等)的用户体验也不是特别好。

目前Sun的官方解决思路是为JRE引入一种新型的部署模型,初次下载时体积非常小,只有在需要时才下载其他的JRE组件。但是具体的效果如何,我们还需拭目以待。

PS:如果Windows能普及jre该有多好啊……