2015-07-16 10 views
12

Ho bisogno di mappare le coordinate X, Y dell'apert sul Touchmap X, Y all'interno di ImageView per fare questo uso il seguente approccio.Ottieni le coordinate x e y reali degli utenti toccate

Tuttavia questo approccio sembra funzionare solo quando ho uno:
una) Zoom completamente l'immagine (fino in fondo)
b) Funziona in ogni caso se mi metto a schermo intero delle applicazioni

final int index = event.getActionIndex(); 
    touchLocation = new float[] { 
    event.getX(index), event.getY(index) 
    }; 

    Matrix matrix = new Matrix(); 
    ImageView view = getImageView(); 
    view.getImageMatrix().invert(matrix); 

    matrix.postTranslate(view.getScrollX(), view.getScrollY()); 
    matrix.mapPoints(touchLocation); 
    // touchLocation[0] is real x and [1] is real y 

Tuttavia la mia attività è un'attività di ActionBar quindi ho una posizione leggermente sbagliata sull'asse Y. Ho provato a dedurre l'altezza di ActionBar e StatusBar ma questo non sempre funziona.

Ciò che è strano è che a schermo intero non importa se io ingrandisco completamente la mia immagine dentro o fuori ottengo sempre coordinate corrette calcolate tuttavia con qualsiasi altro tipo di attività questo non mapperà i punti correttamente.

+0

da dove ricevi l'evento? è l'evento che proviene da un evento touch da un genitore della vista immagine o dalla vista immagine stessa? –

+0

Penso che dovresti fare riferimento a questo link: [Come ottenere l'altezza della barra delle azioni] (http://stackoverflow.com/questions/12301510/how-to-get-the-actionbar-height). Aiuterà a calcolare la coordinata X e Y corretta. Ho riscontrato anche questo problema. – Joey

+0

Quindi stai iniziando con le coordinate assolute sullo schermo e hai bisogno di convertire in coordinate relative alla parte superiore sinistra dell'immagine? –

risposta

6

Io uso questo codice per ottenere la realtà asse del tocco sullo schermo:

PointF p = new PointF(event.getX(), event.getY()); 
View v = this;// your view 
View root = v.getRootView(); 
while (v.getParent() instanceof View && v.getParent() != root) { 
    p.y += v.getTop(); 
    p.x += v.getLeft(); 
    v = (View) v.getParent(); 
} 

Spero che questo funziona per voi pure

2

Prova questo modo

int[] viewCoords = new int[2]; 
imageView.getLocationOnScreen(viewCoords); 
int touchX = (int) event.getX(); 
int touchY = (int) event.getY(); 

int imageX = touchX - viewCoords[0]; // viewCoords[0] is the X coordinate 
int imageY = touchY - viewCoords[1]; // viewCoords[1] is the y coordinate 

otterrete le coordinate x e y usando questo modo

+0

Stesso risultato del mio. –

2

Override onTouchEvent (evento MotionEvent) e quindi chiamare event.getX() e event.getY() per ottenere le coordinate delle posizioni in cui l'utente ha toccato [saranno galleggianti]. (da: @antonyt)

+0

Non è quello che sto cercando. –

2

Passaggio 1: creare un CustomFrameLayout personalizzato estendendo FrameLayout nella propria app che può richiedere un oggetto di interfaccia nel costruttore. (l'interfaccia verrà creata al passaggio 3)

Passaggio 2: scrittura/sovrascrittura del metodo onInterceptTouchEvent.

Passaggio 3: Creare un'interfaccia per inviare/ricevere i parametri desiderati.

Fase 4: Implementare l'interfaccia e il metodo creato nel passaggio 3 nella vostra attività/frammento

Fase 5: Nella vostra attività/frammento creare l'oggetto di CustomFrameLayout con implementare l'interfaccia.

Fase 6: Nel metodo override del layout personalizzato, passare il valore per l'attività attraverso l'interfaccia

Spero che questo funzionerà!


Fare una demo sarebbe voluto un po 'più a lungo, avrebbe piuttosto inviare come commento, ma ancora la pubblicazione come la risposta in modo che io possa un giorno migliorare con qualche esempio di codice.

+0

Non sono sicuro di come questo mi aiuti a ottenere le coordinate corrette. –

3

Assicurarsi che le altezze ActionBar e di stato sono in pixel e non dp e puoi provare a usare getRawX() e getRawY() invece di getX(), getY()

Problemi correlati