JavaFX事件(4)手勢事件 by 黃嘉輝 | CodeData
top

JavaFX事件(4)手勢事件

分享:

JavaFX事件(3)滑鼠事件 << 前情

由於目前大部份裝置均支援觸控螢幕 (Touch Screen) 與觸控板 (Touch Pad) ,因此JavaFX增加支援處理多點觸控 (Multi-Touch) 的事件類別,分別為GestureEventTouchEvent,以處理手勢與觸控事件,分別由以下事件類別處理:

  • GestureEvent:手勢事件。
  • RotateEvent:旋轉事件,繼承自GestureEvent
  • ScrollEvent:捲動事件,繼承自GestureEvent
  • SwipeEvent:滑動事件,繼承自GestureEvent
  • ZoomEvent:縮放事件,繼承自GestureEvent

並由以下方法設定事件的Event Handler函式:

  • setOnRotate():進行旋轉手勢。
  • setOnRotationFinished():完成旋轉手勢。
  • setOnRotationStarted():開始旋轉手勢。
  • setOnScroll():進行滑鼠滾動或捲動手勢。
  • setOnScrollFinished():完成捲動手勢。
  • setOnScrollStarted():開始捲動手勢。
  • setOnSwipeDown():向下滑動手勢。
  • setOnSwipeLeft():向左滑動手勢。
  • setOnSwipeRight():向右滑動手勢。
  • setOnSwipeUp():向上滑動手勢。
  • setOnZoom():進行縮放手勢。
  • setOnZoomFinished():完成縮放手勢。
  • setOnZoomStarted():開始縮放手勢。

GestureEvent類別為上述事件類別的基礎類別,繼承自InputEvent類別,支援觸控螢幕與觸控板,由於使用者直接在觸控螢幕上觸控,因此JavaFX將觸控螢幕定為直接觸控事件 (Direct Touch Event),而觸控板則屬於間接觸控事件 (Indirect Touch Event)。

旋轉事件

旋轉 (Rotate) 手勢是以兩隻手指觸碰螢幕或物件,然後旋轉手指以轉動螢幕或物件,由於旋轉的過程牽涉到旋轉角度,因此需處理開始旋轉、進行旋轉、完成旋轉與旋轉角度。旋轉事件的類別為RotateEvent,繼承自GestureEvent類別,RotateEvent類別定義以下的事件類型,以做為註冊Event Handler與Event Filter之用:

  • RotateEvent.ROTATE:進行旋轉手勢。
  • RotateEvent.ROTATION_STARTED:開始旋轉手勢。
  • RotateEvent.ROTATION_FINISHED:完成旋轉手勢。
  • RotateEvent.ANY:代表上述任一種事件類型。

並以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之用:

  • SwipeEvent.SWIPE_UP:向上滑動手勢。
  • SwipeEvent.SWIPE_DOWN:向下滑動手勢。
  • SwipeEvent.SWIPE_LEFT:向左滑動手勢。
  • SwipeEvent.SWIPE_RIGHT:向右滑動手勢。
  • SwipeEvent.ANY:代表上述任一種事件類型。

並分別以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
[2] JavaFX
[3] NetBeans
[4] JavaFX 8.0 API Specification.
[5] Java Platform, Standard Edition 8 API Specification.

後續 >> JavaFX特效(1)陰影(Shadow)處理

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

關於作者

黃嘉輝副教授,目前任職於國立臺北商業大學企業管理學系,喜歡寫程式,特別愛Java,範例可參考教學網站

熱門論壇文章

熱門技術文章