JavaFX事件(4)手勢事件
由於目前大部份裝置均支援觸控螢幕 (Touch Screen) 與觸控板 (Touch Pad) ,因此JavaFX增加支援處理多點觸控 (Multi-Touch) 的事件類別,分別為GestureEvent與TouchEvent,以處理手勢與觸控事件,分別由以下事件類別處理:
並由以下方法設定事件的Event Handler函式:
GestureEvent類別為上述事件類別的基礎類別,繼承自InputEvent類別,支援觸控螢幕與觸控板,由於使用者直接在觸控螢幕上觸控,因此JavaFX將觸控螢幕定為直接觸控事件 (Direct Touch Event),而觸控板則屬於間接觸控事件 (Indirect Touch Event)。 旋轉事件 旋轉 (Rotate) 手勢是以兩隻手指觸碰螢幕或物件,然後旋轉手指以轉動螢幕或物件,由於旋轉的過程牽涉到旋轉角度,因此需處理開始旋轉、進行旋轉、完成旋轉與旋轉角度。旋轉事件的類別為RotateEvent,繼承自GestureEvent類別,RotateEvent類別定義以下的事件類型,以做為註冊Event Handler與Event Filter之用:
並以setOnRotationStarted()、setOnRotate()與setOnRotationFinished()方法分別設定開始、進行與完成旋轉事件的Event Handler函式。 請參考以下範例示範如何處理旋轉事件,分別以相關方法設定Event Handler函式,以setOnRotate()為例,分別以ImageView類別的getRotate()方法取得圖像的角度、RotateEvent類別的getAngle()方法取得旋轉的角度,接著再以ImageView類別的setRotate()方法設定圖像的角度,以產生旋轉的效果,可試著以兩隻手指觸碰並旋轉圖像。需注意的是,旋轉事件僅適用於觸控螢幕與觸控板: ImageView imageview = new ImageView(new Image( getClass().getResourceAsStream("images/duke.png"))); // 開始旋轉 imageview.setOnRotationStarted(new EventHandler() { @Override public void handle(RotateEvent e) { imageview.setEffect(new DropShadow()); e.consume(); } }); // 進行旋轉 imageview.setOnRotate(new EventHandler() { @Override public void handle(RotateEvent e) { imageview.setRotate(imageview.getRotate() + e.getAngle()); e.consume(); } }); // 完成旋轉 imageview.setOnRotationFinished(new EventHandler() { @Override public void handle(RotateEvent e) { imageview.setEffect(null); e.consume(); } }); 滑動事件 滑動 (Swipe) 手勢是以一隻以上的手指往上下左右四個方向掃動螢幕或物件,通常用以切換畫面或相片。滑動事件的類別為SwipeEvent,繼承自GestureEvent類別,SwipeEvent類別定義以下的事件類型,以做為註冊Event Handler與Event Filter之用:
並分別以setOnSwipeUp()、setOnSwipeDown()、setOnSwipeLeft()與setOnSwipeRight()方法設定上下左右滑動事件的Event Handler函式。 請參考以下範例示範如何處理滑動事件,分別以相關方法設定Event Handler函式,以setOnSwipeUp()為例,分別以TranslateTransition類別的setByX()與setByY()方法設定圖像的水平與垂直移動的單位,接著再以playFromStart()方法從頭播放動畫,以產生向上滑動的效果,可試著以一隻以上的手指往上下左右四個方向掃動圖像。需注意的是,滑動事件僅適用於觸控螢幕與觸控板: ImageView imageview = new ImageView(new Image( getClass().getResourceAsStream("images/duke.png"))); TranslateTransition transition = new TranslateTransition(duration, imageview); // 向上滑動 imageview.setOnSwipeUp(new EventHandler() { @Override public void handle(SwipeEvent e) { if (imageview.getTranslateY() > 0) { transition.setByX(0); transition.setByY(-HEIGHT); transition.playFromStart(); } } }); // 向下滑動 imageview.setOnSwipeDown(new EventHandler() { @Override public void handle(SwipeEvent e) { if (imageview.getTranslateY() <= 0) { transition.setByX(0); transition.setByY(HEIGHT); transition.playFromStart(); } } }); // 向左滑動 imageview.setOnSwipeLeft(new EventHandler() { @Override public void handle(SwipeEvent e) { if (imageview.getTranslateX() > 0) { transition.setByX(-WIDTH); transition.setByY(0); transition.playFromStart(); } } }); // 向右滑動 imageview.setOnSwipeRight(new EventHandler() { @Override public void handle(SwipeEvent e) { if (imageview.getTranslateX() <= 0) { transition.setByX(WIDTH); transition.setByY(0); transition.playFromStart(); } } }); 【參考資料】 [1] Java Official Web Site |