首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用sceentap手势来鞭打媒体的灵魂?

如何使用sceentap手势来鞭打媒体的灵魂?
EN

Stack Overflow用户
提问于 2014-09-23 01:22:07
回答 1查看 167关注 0票数 1

我想改变媒体来源,并在javafx中使用leap动作重新启动mediaplayer。

  1. 如何在LeapListener中重新启动mediaplayer屏幕手势?
  2. 热用滑动手势改变媒体源?

还有什么需要修复的吗? plz帮助(我是java的初学者&这是第一次编程)

这是我的密码

公共类Leaptest扩展应用程序{

代码语言:javascript
复制
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扩展侦听器{

代码语言:javascript
复制
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;**

            }
    }
}

}

EN

回答 1

Stack Overflow用户

发布于 2014-09-23 14:02:13

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

为此,您可以很容易地将ObjectProperty<T>对象添加到LeapListener类中,以便为给定的手势在每一帧设置所需的值。然后,您必须实现它们的相关公共ObservableValue<T>方法。

在JavaFX线程上,可以添加一个非殖化的ChangeListener<T>类来侦听ObservableValue中的任何更改。注意,您必须使用Platform.runLater()

LeapListener类开始:

代码语言:javascript
复制
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类中:

代码语言:javascript
复制
@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运动控制器检测到一个点击/滑动手势,属性就会被更新,监听器就会被触发。在JavaFX线程中,您现在可以响应这些手势了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25985448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档