【问题标题】:Retrieve center point XY coordinates from selection从选择中检索中心点 XY 坐标
【发布时间】:2013-06-24 07:32:33
【问题描述】:

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

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

到目前为止,我有以下代码,但老实说,我不知道从那里去哪里。如何绘制一个用户可以操作和移动的矩形(然后从中返回 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

【问题讨论】:

  • 如果我把这张被选中的黄色矩形的图像放大,你能发布结果图像吗?那么结果会是什么样子?

标签: java android coordinates


【解决方案1】:

我不确定您已经完成了多少应用程序。但是,您需要一种方法来识别移动方块与拉伸方块。您可以通过按钮执行此操作,也可以在设计中执行此操作(从正方形内部移动并从边界拉伸)。

   @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?

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

      好吧,如果我根据您的代码正确理解您使用的是SurfaceView,那么要在其中绘图,您可以阅读接受的答案here,其中private void drawMyStuff(final Canvas canvas) 您必须输入代码来绘制您想要的矩形,并在每次更改某些内容(如坐标)时调用invalidate() 以重绘SurfaceView

      您还可以创建自己的自定义View 并在其中绘图,您可以看到我在我的项目here 中使用的一个工作示例。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-18
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 1970-01-01
        相关资源
        最近更新 更多