2013-06-26 12 views
5

Co mam zamiar zrobić, to pozwolić użytkownikowi mojej aplikacji Android, aby wybrać punkty na twarzy i pobrać współrzędne X i Y z tego dotyku. Zobacz poniższe zdjęcie.Pobierz współrzędne XY punktu środkowego z zaznaczenia

Coordinates from face

Chciałbym użytkownika, aby móc zmienić rozmiar placu selekcji.

Do tej pory mam poniższy kod, ale szczerze mówiąc nie mam pojęcia, dokąd się udać. Jak mam rysować prostokąt, który użytkownik może manipulować i przesuwać (a następnie zwracać współrzędne punktu środkowego X i Y)? 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; 
     } 
    });  
} 

Dziękujemy!

może być przydatna: Custom Android Image Crop https://github.com/dtitov/pickncrop/blob/master/src/com/github/pickncrop/MainActivity.java

+0

Możesz pisać obraz wynik jeśli zrobię to obraz, który jest wybrany żółty prostokąt duży wtedy jak jest rezultatem będzie wyglądać? – KOTIOS

Odpowiedz

1

dobrze, jeśli dobrze rozumiem, według kodu używasz SurfaceView więc narysować wewnątrz niego można przeczytać zaakceptowane odpowiedź here gdzie wewnątrz private void drawMyStuff(final Canvas canvas) trzeba umieścić kod do rysowania prostokątów chcesz, i zadzwoń pod numer invalidate(), aby przerysować SurfaceView za każdym razem, gdy coś zmienisz (np. współrzędne).

Możesz również stworzyć swój własny niestandardowy View i narysować w nim, możesz zobaczyć działający przykład, którego używam w moim projekcie here.

Masz już współrzędne (x, y) dotyku, aby narysować prostokąty wewnątrz swojego SurfaceView przy użyciu Canvas.Oto niektóre kodu można użyć w celach informacyjnych, wszystko co musisz zrobić, to zmienić numery przez (x, y) współrzędne gdzie chcesz rysować:

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

teraz, aby zmienić rozmiar prostokąta trzeba będzie zapisać gdzieś koordynuje, możesz użyć Rect, aby zapisać współrzędne dla każdego istniejącego prostokąta. Następnie, aby zmienić ich rozmiar, możesz odczytać współrzędne z ekranu dotykowego i sprawdzić, czy są W POBLIŻU niektóre współrzędne prostokąta. Mówię w pobliżu, ponieważ trudno byłoby dotknąć dokładnie współrzędnej rogu, trzeba sprawdzić, czy jest na przykład w + 10 pikseli za rogiem. Dbaj o rozmiar prostokąta, może te 10 pikseli to szerokość lub wysokość prostokąta.

Wreszcie na ACTION_DOWN śledzić na ziemię jak piszę przed i na ACTION_UP podjąć nowe współrzędne rogu wy wykryte zanim na ACTION_DOWN, następnie zadzwonić invalidate() odświeżenia swoich prostokątów i gotowe!

Mam nadzieję, że mnie zrozumiał i pomaga w jakiś sposób :)

4

Nie jestem pewien, jak wiele aplikacji masz zrobić. Będziesz jednak potrzebował sposobu, aby zidentyfikować przesuwanie kwadratów w stosunku do rozciągania kwadratów. Możesz to zrobić za pomocą przycisku lub możesz to zrobić na designie (przesuń się od środka kwadratu i rozciągnij od granic).

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

Musisz zajrzeć do przykładów, jak przerysować kwadraty. Nie jestem pewien, jak je rysujesz w pierwszej kolejności.

EDYCJA: Oto kilka przydatnych źródeł. Jeśli połączyć dwa, powinieneś być w stanie łatwo osiągnąć swój cel:

Moving image with touch events

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

2

Ponieważ jesteś już coraz punkt dotyku wszystko, co można zrobić, to narysować prostokąt lub kwadrat wokół to z domyślnym rozmiarem

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

Następnie w zależności od punktu dotyku w prostokącie można przeciągnąć lub skalować prostokąt.
Istnieje samouczek google, którego można użyć do przeciągnięcia i skalowania prostokąta.
Znajdź poniżej link.
http://developer.android.com/training/gestures/scale.html

Powiązane problemy