【问题标题】:how to chage media soures by using sceentap gesture?如何使用屏幕点击手势更改媒体源?
【发布时间】:2014-09-23 01:22:07
【问题描述】:

我想在 javafx 中使用跳跃手势更改媒体源并重新启动 mediaplayer。

  1. 如何在 LeapListener 中描述屏幕轻击手势情况以重新启动媒体播放器?
  2. 使用滑动手势更改媒体源很热门?

有什么可以修复的请帮忙(我是java初学者,这是第一次编程)

这是我的代码

公共类 Leaptest 扩展应用程序{

private final LeapListener listener = new LeapListener();
private final Controller leapcontroller = new Controller();
private Media media = new Media("file:///C:/Users/halim.shin/workspace/Movie/flower.mp4");
private MediaPlayer player = new MediaPlayer(media);
private MediaView view = new MediaView(player);


@Override
public void start(Stage Stage) throws Exception {
    leapcontroller.addListener(listener);
    BorderPane root = new BorderPane();


    int key_move_delta = 10;
    double size_delta = 1.05;   

    root.setCenter(view);

    Scene scene = new Scene(root,500,500,Color.BLACK);
    scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 

    scene.setOnKeyPressed(new EventHandler<KeyEvent>(){
        @Override
        public void handle(KeyEvent event) {
            // TODO Auto-generated method stub
            switch(event.getCode()){
                case UP             : view.setTranslateY(view.getTranslateY()   -   key_move_delta); break;
                case RIGHT          : view.setTranslateX(view.getTranslateX()   +   key_move_delta); break;
                case DOWN           : view.setTranslateY(view.getTranslateY()   +   key_move_delta); break;
                case LEFT               : view.setTranslateX(view.getTranslateX()   -   key_move_delta); break;
                case PAGE_UP        : view.setScaleX(view.getScaleX()*size_delta); view.setScaleY(view.getScaleY()*size_delta); break;
                case PAGE_DOWN  : view.setScaleX(view.getScaleX()/size_delta); view.setScaleY(view.getScaleY()/size_delta); break;
                case ENTER          : player.pause(); break;
                case SPACE          : player.play(); break;             
            }
        }   
    });

    player.setCycleCount(MediaPlayer.INDEFINITE);
    player.setMute(true);
//  player.play(); //

    Stage.setFullScreen(false);
    Stage.setScene(scene);
    Stage.show();   

}

public void stop(){
    leapcontroller.removeListener(listener);
}

public static void main(String[] args){
    launch(args);
}

}

公共类 LeapListener 扩展监听器 {

public void onConnect(Controller controller){
    controller.enableGesture(Gesture.Type.TYPE_SWIPE);
    controller.enableGesture(Gesture.Type.TYPE_CIRCLE);
    controller.enableGesture(Gesture.Type.TYPE_SCREEN_TAP); 
    controller.enableGesture(Gesture.Type.TYPE_KEY_TAP);
}

public void onFrame(Controller controller){



    Frame frame = controller.frame();
    GestureList gestures = frame.gestures();
    for(int i=0; i<gestures.count(); i++){
        Gesture gesture = gestures.get(i);

            **switch (gesture.type()){
            case TYPE_SCREEN_TAP :
            ??????????????????

                System.out.println("Key");
                break;
            default : 
                break;**

            }
    }
}

}

【问题讨论】:

    标签: javafx-8 leap-motion


    【解决方案1】:

    您必须与两个不同的线程通信:JavaFX 线程和 Leap Motion 线程。

    为此,您可以轻松地将ObjectProperty&lt;T&gt; 对象添加到LeapListener 类,以便在给定手势的每一帧设置所需的值。然后你必须实现他们相关的公共ObservableValue&lt;T&gt;方法。

    在 JavaFX 线程上,可以添加一个匿名的 ChangeListener&lt;T&gt; 类来监听 ObservableValue 的任何变化。请注意,您必须使用Platform.runLater()

    LeapListener 类开始:

    public class LeapListener extends Listener {
    
        private final BooleanProperty keyTap= new SimpleBooleanProperty(false);
        public BooleanProperty keyTapProperty() { return keyTap; }
    
        public enum DIRECTION { NONE,LEFT,RIGHT,UP,DOWN }
        public ObjectProperty<DIRECTION> swipeGesture=new SimpleObjectProperty<>();
    
        @Override
        public void onConnect(Controller controller){
            controller.enableGesture(Gesture.Type.TYPE_KEY_TAP);
            controller.enableGesture(Gesture.Type.TYPE_SWIPE);
        }
    
        @Override
        public void onFrame(Controller controller){
    
            Frame frame = controller.frame();
    
            // reset properties
            keyTap.set(false);
            swipeGesture.set(DIRECTION.NONE);
    
            GestureList gestures = frame.gestures();
            for(int i=0; i<gestures.count(); i++){
                Gesture gesture = gestures.get(i);
                switch (gesture.type()){
                    case TYPE_SCREEN_TAP :
                        keyTap.set(true);
                        break;
                    case TYPE_SWIPE: 
                        SwipeGesture swipe = new SwipeGesture(gesture);
                        if(Math.abs(swipe.direction().getX()) > 
                           Math.abs(swipe.direction().getY())){
                            if(swipe.direction().getX() > 0){
                                swipeGesture.set(DIRECTION.RIGHT);
                            } else {
                                swipeGesture.set(DIRECTION.LEFT);
                            }
                        } else {
                            if(swipe.direction().getY() > 0){
                                swipeGesture.set(DIRECTION.UP);
                            } else {
                                swipeGesture.set(DIRECTION.DOWN);
                            }                  
                        }
                        break;
                    default : 
                        break;
                }
            }
        }
    }
    

    在您的 JavaFX 类中:

    @Override
    public void start(Stage stage) {
    
        ...
    
        LeapListener leapListener=new LeapListener();
    
        leapListener.keyTapProperty().addListener(
                (ObservableValue<? extends Boolean> ov, Boolean t, final Boolean t1) -> {
            if(t1){
                Platform.runLater(() -> {
                    // React to Tap Gesture...
                    player.play();
                });
            }
        });
    
        leapListener.swipeGesture.addListener(
           (ObservableValue<? extends LeapListener.DIRECTION> observable,
            LeapListener.DIRECTION oldValue, LeapListener.DIRECTION newValue) -> {
                    Platform.runLater(()->{
                        // React to Swipe Gesture ...
                        switch(newValue){
                            case UP     : break;
                            case RIGHT  : break;
                            case DOWN   : break;
                            case LEFT   : break;
                        }
                    });
        }); 
    
        player.setCycleCount(MediaPlayer.INDEFINITE);
        player.setMute(true);
    //  player.play(); //
    
        stage.setFullScreen(false);
        stage.setScene(scene);
        stage.show();   
    }
    

    请注意,只要 Leap Motion 控制器检测到 Tap/Swipe 手势,就会更新属性并触发侦听器。现在,在 JavaFX 线程中,您可以响应该手势。

    【讨论】:

    • 感谢您的帮助。我可以通过复制您的建议来完成代码。但是我仍然无法为其他项目做出新的举动。我在哪里可以获得学习 javafx 和 Leap motion 的信息?您能推荐书籍或网站之类的东西吗?
    • 我想这里不是推荐书籍或博客的地方,但你可以很容易地在网上找到我关于 JavaFX 和 Leap Motion 的工作:)
    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多