1. 程式人生 > >JavaFx實現-漸變效果之一

JavaFx實現-漸變效果之一


自從JavaOne大會推出JavaFX後,我一直比較關注這個專案,它是一種利用Java的指令碼技術,功能上近似於Flash。 它的優勢在於,Flash雖有很好的功能和普及度,但它永遠不能交付Java類庫的大部分功能,而 JavaFX可以。因為也給了JavaFX一個“可能性”上的生存空間。



但是由於JavaFX推出的太晚,兼之文件較少,很多人還是對其望而止步,乾等下去也不是辦法。所以我最近空閒時會寫一些JavaFX的小例子以作練習之用。

import javafx.ui.*;
import javafx.ui.canvas.*;
//圓點漸變過濾器
class CircleTransition extends
 CompositeNode {
  
//設定引數項 變數名:型別
    attribute r: Number;
    attribute d: Number;
    attribute w: Number;
    attribute h: Number;
    attribute xp: Number;
    attribute img: Image;
}

//為引數賦值
attribute CircleTransition.r  =-45;
attribute CircleTransition.d  
=16;
attribute CircleTransition.w  
=320;
attribute CircleTransition.h  
=240;
attribute CircleTransition.xp 
=-w;
//注入過濾器引數
function CircleTransition.composeNode() = Group {
  content:[Clip 
{
  
//注入shape
    shape: Rect { x:0, y:0, width:w, height:h },
    
//設定偏移
    transform: translate(1040),
    
//注入Group
    content: Group {
    
//載入ImageView用以顯示影象
      content: [ImageView {
        transform: translate(
-60-30),
        image: 
this.img,
        
//分段繪製圖像
      }
, Subtract {
        shape1: Rect 
{ x:0, y:0, width:w*4, height:h*4 },
        fill:orange,
        
//bind
        transform: bind [rotate(r, 0, h), translate(-w+xp, 0)],
        shape2: Union 
{
          content: [foreach (j in [
0..w/d], i in [0..h/d*2]) Circle {
            radius: j,
            cx: w
-j*d,
            cy: i
*d,
          }
, Rect {
            x:
-w, y:0, width:w+w/2, height:h*2,
          }
]
        }

      }
],
    }

  }
, View {
    content: GroupPanel 
{
     var row 
= Row {alignment: BASELINE}
     var column1 
= Column {}
     var column2 
= Column {}
     
//滑鼠設為預設
      cursor: DEFAULT
      rows: [row]
      columns: [column1, column2]
      content: [SimpleLabel 
{
        row: row
        column: column1
        text: 
"操作:"
      }
, Button {
        row: row
        column: column2
        opaque: 
false
        mnemonic: T
        text: 
"變更影象"
        action: operation() 
{
            xp 
= [0,d..w*2] dur 2000;
        }

      }
]
    }

  }

]}
;
Frame 
{
  title  : 
"JavaFX - 影象漸變效果1"
  width  : 
350
  height : 
350
  content: Canvas 
{ content: CircleTransition{img: { url: "image.jpg" }} }
  centerOnScreen: 
true
  visible: 
true
}
;  


效果圖:


第一次寫程式碼的感覺就是效率太慢……

由解釋到執行的效率比Swing還不能令人忍受(當然,有程式碼優化的餘地,但還是太慢)

且拋去效率問題不提,桌面JavaFX現在還有一個比較關鍵的問題,那就是如何部署。對於從前沒有安裝過JRE的使用者來說,JRE體積太大,而且現在從瀏覽器上進行按需安裝(如使用Java Start Web等)的使用者體驗也不是特別好。

目前Sun的官方解決思路是為JRE引入一種新型的部署模型,初次下載時體積非常小,只有在需要時才下載其他的JRE元件。但是具體的效果如何,我們還需拭目以待。

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