5

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

面坐标

我希望用户能够更改选择方块的大小。

到目前为止,我有以下代码,但老实说,我不知道从那里去哪里。如何绘制用户可以操作和移动的矩形(然后从中返回 X 和 Y 中心点坐标)?我敢肯定有一个Android功能。

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

谢谢!

可能有用: 自定义 Android 图像裁剪 https://github.com/dtitov/pickncrop/blob/master/src/com/github/pickncrop/MainActivity.java

4

3 回答 3

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

您需要查看如何重绘正方形的示例。我不确定你是如何首先绘制它们的。

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

带有触摸事件的移动图像

Android:如何在保持纵横比的同时将图像拉伸到屏幕宽度?

于 2013-07-01T15:54:17.490 回答
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

于 2013-07-04T12:47:35.747 回答
1

好吧,如果我根据您的代码正确理解,您正在使用so 在其中绘制,您可以在此处SurfaceView阅读接受的答案,您必须在其中放置代码以绘制所需的矩形,并在每次更改时调用以重绘某些东西(如坐标)。private void drawMyStuff(final Canvas canvas)invalidate()SurfaceView

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

您已经有了触摸的 (x,y) 坐标,因此可以在SurfaceViewusing中绘制矩形Canvas。这里有一些代码可供参考,您所要做的就是通过您要绘制的 (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()重绘你的矩形,你就完成了!

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

于 2013-07-07T19:19:18.217 回答