Domanda

Sto sviluppando un gioco Android. In questo ho due immagini mobili sullo schermo, sono in grado di trascinare queste immagini, ma il mio ulteriore requisito è quello di mettere in pausa l'immagine quando tocco l'immagine. Non sto trovando alcun evento per mettere in pausa l'immagine e il riavvio si muove nella stessa posizione in cui l'immagine è stata messa in pausa.

Qualsiasi corpo può dirmi la soluzione. Grazie.

Sto usando ONTouch per trascinare e spostare l'immagine.

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;
    }
È stato utile?

Soluzione

Sulla base del codice e del collegamento nel tuo commento, ci sono alcune cose che devono essere cambiate per raggiungere il tuo obiettivo. Prima di tutto, dovrai essere in grado di distinguere tra un singolo tocco e un movimento di trascinamento. Il primo "metterà in pausa" un'immagine/droide, mentre il secondo ti permetterà di trascinarlo in giro.

Un modo per andare a questo sarebbe quello di mantenere una bandiera che determina l'azione. Qualcosa come questo:

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;
}

Per impedire effettivamente l'immagine/droide di fare più movimenti, è necessario aggiungere un po 'di metodo per impostare la velocità sia in direzione orizzontale che verticale su "0". In alternativa, è possibile impostare un flag che indica se si desidera aggiornare la posizione.

Sulla base di quale approccio adotti, potrebbe anche dover cambiare la logica di aggiornamento per tenere conto dello stato "pausa". Se scegli semplicemente di impostare la velocità su (0,0), probabilmente non dovrai fare nulla poiché lo spostamento si tradurrà in "0" per entrambe le direzioni.

Nel frammento del codice presumo che ci sia un metodo setpause (booleano) e ispaused (). Questi dovrebbero funzionare su una bandiera o sui valori di velocità direttamente.

Ad esempio, usando un flag:

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());
    }
}

O direttamente usando i valori di velocità:

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
}

Si noti che non ho testato nessuno del codice né è intenzionato a essere un esempio completo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top