2013-06-26 3 views
5

Что я хочу сделать, так это позволить пользователю моего приложения Android выбрать точки на лице и получить координаты X и Y от этого касания. См. Рисунок ниже.Извлечь центральную точку XY координаты из выбора

Coordinates from face

Я хотел бы, чтобы пользователь имел возможность изменить размер квадрата выбора.

Пока у меня есть код ниже, но я честно понятия не имею, куда идти оттуда. Как я могу рисовать прямоугольник, который пользователь может манипулировать и перемещать (а затем возвращать координаты центра X и 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; 
     } 
    });  
} 

Спасибо!

Может быть полезно: Custom Android Image Crop https://github.com/dtitov/pickncrop/blob/master/src/com/github/pickncrop/MainActivity.java

+0

вы можете разместить получившееся изображение, если я сделать это изображение, которое будет выбран желтый прямоугольник большим, то, как результат буду выглядеть? – KOTIOS

ответ

1

Ну если я правильно понимаю, в соответствии с вашим кодом вы используете SurfaceView так, чтобы рисовать в нем вы можете прочитать принятый ответ here, где внутри private void drawMyStuff(final Canvas canvas) вы должны поставить код для рисования прямоугольников, которые вы хотите, и позвоните invalidate(), чтобы перерисовать SurfaceView каждый раз, когда вы что-то меняете (например, координаты).

Также вы можете создать свой собственный View и нарисовать внутри него, вы можете увидеть рабочий пример, который я использую в своем проекте here.

У вас уже есть (x, y) координаты касания, чтобы нарисовать прямоугольники внутри вашего SurfaceView, используя Canvas.Вот некоторые код, который вы можете использовать для справки, все, что вам нужно сделать, это изменить номера по (х, у) координаты, где вы хотите сделать:

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

Теперь, чтобы изменить размеры прямоугольника вы должны сохранить координаты где-то, вы можете использовать Rect, чтобы сохранить координаты для каждого прямоугольника, который у вас есть. Затем, чтобы изменить размер, вы можете прочитать координаты с сенсорного экрана и посмотреть, находятся ли они в непосредственной близости от некоторых координат ваших прямоугольников. Я говорю рядом, потому что было бы трудно коснуться точно координаты угла, вы должны увидеть, есть ли это, например, в -10 пикселей за углом. Позаботьтесь о размере прямоугольника, возможно, эти 10 пикселей - ширина или высота прямоугольника.

Наконец на ACTION_DOWN отслеживать угол, как я пишу до и на ACTION_UP взять новые координаты угла вы обнаруженные на ACTION_DOWN, то вы звоните invalidate() перекроить свои прямоугольники, и вы сделали!

Я надеюсь, что вы меня поняли и поможет вам в некотором роде :)

4

Я не уверен, сколько приложение, которое вы сделали. Однако вам понадобится способ определить перемещение квадратов и растягивание квадратов. Вы можете сделать это с помощью кнопки или вы можете сделать это по дизайну (перемещение из внутреннего квадрата и растяжение с границ).

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

Вам нужно будет изучить примеры перерисовки квадратов. Я не уверен, как вы их рисуете в первую очередь.

EDIT: Вот несколько полезных источников. Если объединить эти два, вы должны быть легко в состоянии достичь своей цели:

Moving image with touch events

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

2

Поскольку вы уже получаете точку касания все, что вы можете сделать, это нарисовать прямоугольник или квадрат вокруг он с размером по умолчанию

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

Тогда в зависимости от точки касания в прямоугольнике вы можете перетаскивать или масштабировать прямоугольник.
Существует учебное пособие по Google, которое вы можете использовать для перетаскивания и масштабирования прямоугольника.
Найдите ниже ссылки.
http://developer.android.com/training/gestures/scale.html