2013-06-26 17 views
5

Quello che sto puntando a fare è consentire all'utente della mia applicazione Android di selezionare punti sul viso e recuperare le coordinate X e Y da quel tocco. Si prega di vedere l'immagine qui sotto.Recupera il punto centrale Coordinate XY dalla selezione

Coordinates from face

vorrei l'utente sia in grado di cambiare la grandezza della piazza selezione.

Finora ho il codice seguente, ma sinceramente non ho idea di dove andare da lì. Come faccio a disegnare un rettangolo che l'utente può manipolare e spostare (e quindi restituire le coordinate del punto centrale X e Y da quello)? I'm sure there's an Android feature for this.

private void selectImg(){ 
    //retrieve X and Y values from touch 
    surfaceView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent pos) { 
      //retrieve position when user finishes touch 
      if (pos.getAction() == MotionEvent.ACTION_UP){ 
        Log.d("X",String.valueOf(pos.getX())); 
        Log.d("Y",String.valueOf(pos.getY())); 
      } 
      return true; 
     } 
    });  
} 

Grazie!

potrebbero essere utili: Custom Android Image Crop https://github.com/dtitov/pickncrop/blob/master/src/com/github/pickncrop/MainActivity.java

+0

è possibile inviare l'immagine risultato se faccio questa immagine che è il rettangolo giallo selezionata grande allora come è il risultato andando assomigliare? – KOTIOS

risposta

1

Beh, se ho capito bene in base al codice che si sta utilizzando un SurfaceView modo per disegnare al suo interno si può leggere la risposta accettata here dove al suo interno private void drawMyStuff(final Canvas canvas) bisogna mettere il codice per disegnare i rettangoli che si desidera, e chiama invalidate() per ridisegnare lo SurfaceView ogni volta che cambi qualcosa (come le coordinate).

Inoltre è possibile creare il proprio View personalizzato e disegnare al suo interno, è possibile vedere un esempio di lavoro che sto utilizzando nel mio progetto here.

Hai già le coordinate (x, y) del tocco in modo da disegnare i rettangoli all'interno del tuo SurfaceView utilizzando Canvas.Qui po 'di codice è possibile utilizzare come riferimento, tutto quello che dovete fare è cambiare i numeri dal (x, y) le coordinate in cui si desidera disegnare:

Paint paint = new Paint(); 
paint.setColor(Color.BLACK); 
paint.setStrokeWidth(3); 
canvas.drawRect(30, 30, 80, 80, paint); 
paint.setStrokeWidth(0); 
paint.setColor(Color.CYAN); 
canvas.drawRect(33, 60, 77, 77, paint); 
paint.setColor(Color.YELLOW); 
canvas.drawRect(33, 33, 77, 60, paint); 

Ora per ridimensionare il rettangolo si dovrà salvare il coordinate da qualche parte, è possibile utilizzare Rect per salvare le coordinate per ciascun rettangolo che si ha. Quindi per ridimensionarli puoi leggere le coordinate dal touchscreen e vedere se sono VICINE ad alcune delle coordinate del tuo rettangolo. Dico vicino perché sarebbe difficile toccare esattamente la coordinata dell'angolo, devi vedere se è ad esempio in + -10 pixel dietro l'angolo. Prenditi cura della dimensione del rettangolo, forse quei 10 pixel sono la larghezza o l'altezza del rettangolo.

Finalmente il ACTION_DOWN di monitorare l'angolo mentre scrivo prima e sulla ACTION_UP si prende le nuove coordinate del angolo si rilevati prima su ACTION_DOWN, allora, si chiama invalidate() di ridisegnare i vostri rettangoli e si è fatto!

spero che mi hai capito e ti aiuta in qualche modo :)

4

io non sono sicuro di come gran parte della app che avete fatto. Tuttavia, avrai bisogno di un modo per identificare lo spostamento dei quadrati contro lo stretching dei quadrati. Puoi farlo premendo un pulsante o puoi farlo sul design (spostati da un riquadro interno e allungalo dai limiti).

@Override 
    public boolean onTouch(View view, MotionEvent pos) { 
     //retrieve position when user finishes touch 
     if (pos.getAction() == MotionEvent.ACTION_UP){ 
       Log.d("X",String.valueOf(pos.getX())); 
       Log.d("Y",String.valueOf(pos.getY())); 
     } 
     //pseudo code 
     //if user is dragging 
      //get new dragged position 
      //if boundaries are being dragged 
       //redraw square to match new dragged position (requires some math to stretch properly) 
      //else if inside boundaries being dragged 
       //redraw the square to new dragged position (center it) 

     return true; 
    } 

Avrete bisogno di esaminare esempi di come ridisegnare i quadrati. Non sono sicuro di come li stai disegnando in primo luogo.

MODIFICA: ecco alcune fonti utili. Se si combinano i due, si dovrebbe essere facilmente in grado di raggiungere il tuo obiettivo:

Moving image with touch events

Android: How to stretch an image to the screen width while maintaining aspect ratio?

2

Dal momento che si sta già ottenendo il punto di contatto tutto quello che puoi fare è disegnare un rettangolo o un quadrato intorno con dimensione predefinita

Point touchPoint=new Point(x, y); 
Paint paint = new Paint(); 
paint.setColor(Color.parseColor("#00CCFF")); 
canvas.drawRect(x, y, x+100, y+100, paint); 

Poi a seconda del punto di contatto nel rettangolo è possibile sia trascinare o ridimensionare il rettangolo.
Esiste un'esercitazione su google che è possibile utilizzare per trascinare e ridimensionare il rettangolo.
Trova sotto il link.
http://developer.android.com/training/gestures/scale.html

Problemi correlati