Question

Je développe un jeu Android. En cela, j'ai deux images mobiles à l'écran, je suis capable de faire glisser ces images, mais mon autre exigence est de suspendre l'image lorsque je touche l'image. Je ne trouve aucun événement pour suspendre l'image et redémarrer se déplacer à la même position où l'image a été interrompue.

N'importe quel corps peut-il me dire la solution. Merci.

J'utilise Ontouch pour faire glisser et déplacer l'image.

public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            Parcelable state=null;
            // delegating event handling to the droid
            droid1.handleActionDown((int)event.getX(), (int)event.getY());
            droid2.handleActionDown((int)event.getX(), (int)event.getY());
            // check if in the lower part of the screen we exit
            if (event.getY() > getHeight() - 50) {

                thread.setRunning(false);
                ((Activity)getContext()).finish();
            } else {
                Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY());

            }
        } if (event.getAction() == MotionEvent.ACTION_MOVE) {
            // the gestures
            if (droid1.isTouched()) {
                // the droid was picked up and is being dragged
                droid1.setX((int)event.getX());
                droid1.setY((int)event.getY());

            }
            if (droid2.isTouched()) {
                // the droid was picked up and is being dragged
                droid2.setX((int)event.getX());
                droid2.setY((int)event.getY());
            }

        } if (event.getAction() == MotionEvent.ACTION_UP ) {
            // touch was released
            if (droid1.isTouched()) {
                droid1.setTouched(false);
            }
            if (droid2.isTouched()) {
                droid2.setTouched(false);
            }
        }


        return true;
    }
Était-ce utile?

La solution

En fonction de votre code et de votre lien dans votre commentaire, il y a quelques choses qui doivent être modifiées afin d'atteindre votre objectif. Tout d'abord, vous devrez être capable de faire la différence entre un seul coup et un mouvement de traînée. Les premiers «feront une pause» une image / droïde, tandis que le second vous permettra de le faire glisser.

Une façon d'y aller serait de garder un drapeau qui détermine l'action. Quelque chose comme ça:

private boolean mIsDragging = false;

public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // delegating event handling to the droid
        droid1.handleActionDown((int)event.getX(), (int)event.getY());
        droid2.handleActionDown((int)event.getX(), (int)event.getY());
        ...
        mIsDragging = false;
    } if (event.getAction() == MotionEvent.ACTION_MOVE) {
        // the gestures
        if (droid1.isTouched()) {
            // the droid was picked up and is being dragged
            droid1.setX((int)event.getX());
            droid1.setY((int)event.getY());
        }
        if (droid2.isTouched()) {
            // the droid was picked up and is being dragged
            droid2.setX((int)event.getX());
            droid2.setY((int)event.getY());
        }
        mIsDragging = true;  
    } if (event.getAction() == MotionEvent.ACTION_UP ) {
        if (!mIsDragging) {
            // Not dragging means a 'click', thus toggle pausing
            if (droid1.isTouched()) {
                droid1.setPaused(!droid1.isPaused());
            }
            if (droid2.isTouched()) {
                droid2.setPaused(!droid2.isPaused());
            }
        }
        // Always reset on up action
        if (droid1.isTouched()) {
            droid1.setTouched(false);
        }
        if (droid2.isTouched()) {
            droid2.setTouched(false);
        }
        mIsDragging = false;
    }
    return true;
}

Pour empêcher l'image / droïde de faire plus de mouvements, vous devez ajouter une méthode pour définir la vitesse dans la direction horizontale et verticale sur «0». Alternativement, vous pouvez définir un drapeau qui indique si vous souhaitez mettre à jour le poste.

En fonction de l'approche que vous adoptez, vous devrez peut-être également modifier la logique de mise à jour pour prendre en compte l'état «interrompu». Si vous choisissez simplement de définir la vitesse sur (0,0), vous n'aurez probablement pas à faire quoi que ce soit car le déplacement entraînera alors «0» pour les deux directions.

Dans l'extrait de code, je suppose qu'il y a une méthode SETPAUSE (Boolean) et isPaused (). Ceux-ci doivent soit fonctionner directement sur un drapeau, soit sur les valeurs de vitesse.

Par exemple, en utilisant un drapeau:

private boolean mIsPaused = false;

public void setPaused(boolean pause) {
    mIsPaused = pause;
}

public boolean getPaused() {
    return mIsPaused;
}

...

public void update() {
    // Only update if we're not dragging and not 'paused'
    if (!touched && !mIsPaused) {
        x += (speed.getXv() * speed.getxDirection());
        y += (speed.getYv() * speed.getyDirection());
    }
}

Ou directement en utilisant les valeurs de vitesse:

private Speed mSpeed = new Speed(1,1);

public void setPaused(boolean pause) {
    pause ? mSpeed.setSpeed(0,0) : mSpeed.setSpeed(1,1);
}

public boolean getPaused() {
    return mSpeed.getX() == 0 && mSpeed.getY() == 0;
}

...

public void update() {
    // No change necessary as multiplying by '0' results in a zero displacement
}

Notez que je n'ai testé aucun code et il n'est pas inventé d'être un exemple complet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top