我的目标是允许我的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
答案 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)坐标,以便使用SurfaceView
在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()
之前检测到的角落的新坐标,然后调用{{1}重绘你的矩形,你就完成了!
我希望你能理解我并以某种方式帮助你:)