从选择中检索中心点XY坐标

时间:2013-06-26 23:48:16

标签: java android coordinates

我的目标是允许我的Android应用程序的用户选择脸部上的点并从该触摸中检索X和Y坐标。请看下面的图片。

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

3 个答案:

答案 0 :(得分: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;
    }

您需要查看如何重绘方块的示例。我不确定你是如何吸引他们的。

编辑:这是一些有用的资料来源。如果将两者结合起来,您应该能够轻松实现目标:

Moving image with touch events

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

答案 1 :(得分: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);

然后,根据矩形中的触摸点,您可以拖动或缩放矩形 有一个谷歌教程,您可以使用它来拖动和缩放矩形 在下面找到链接。
http://developer.android.com/training/gestures/scale.html

答案 2 :(得分:1)

如果我根据您的代码正确理解您正在使用SurfaceView,那么要在其中绘制,您可以阅读已接受的答案here,其中private void drawMyStuff(final Canvas canvas)您必须放置代码绘制你想要的矩形,并在每次改变某些东西(如坐标)时调用invalidate()重绘SurfaceView

此外,您可以创建自己的自定义View并在其中绘制,您可以在我的项目here中看到我正在使用的工作示例。

您已经拥有触摸的(x,y)坐标,以便使用SurfaceViewCanvas内绘制矩形。这里有一些你可以用来参考的代码,你所要做的就是用你想要绘制的(x,y)坐标来改变数字:

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()之前检测到的角落的新坐标,然后调用{{1}重绘你的矩形,你就完成了!

我希望你能理解我并以某种方式帮助你:)