Android 在ImageView中选择图像的一部分并检索选定矩形的端点
我需要在Android 在ImageView中选择图像的一部分并检索选定矩形的端点,android,imageview,Android,Imageview,我需要在ImageView中拖动并选择图像集的一部分,并在不引起任何修改(如裁剪)的情况下检索所选矩形的端点 到目前为止,我所能做的就是找出用户点击屏幕的点的坐标 ImageView imageView = (ImageView) findViewById(R.id.imageView); imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View
ImageView
中拖动并选择图像集的一部分,并在不引起任何修改(如裁剪)的情况下检索所选矩形的端点
到目前为止,我所能做的就是找出用户点击屏幕的点的坐标
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//Simply displays a toast
Utilities.displayToast(getApplicationContext(), "Touch coordinates : " +
String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
return true;
}
});
但这离我想去的地方很远。我真的没有找到任何与StackOverFlow/Google相关的东西
我如何实现它?这里有一种方法,您可以使用(但是,实现同样的方法有很多可能性)。它基于创建用于绘制和跟踪选择矩形的自定义视图。此外,您还可以在您的
OnTouchListener()
中应用自定义视图的onTouch()
中的逻辑
主要布局:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/root"
android:background="@android:color/background_dark">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/image"
android:src="@drawable/up_image"
android:scaleType="fitXY" />
<com.example.TestApp.DragRectView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/dragRect" />
</RelativeLayout>
活动很简单:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final DragRectView view = (DragRectView) findViewById(R.id.dragRect);
if (null != view) {
view.setOnUpCallback(new DragRectView.OnUpCallback() {
@Override
public void onRectFinished(final Rect rect) {
Toast.makeText(getApplicationContext(), "Rect is (" + rect.left + ", " + rect.top + ", " + rect.right + ", " + rect.bottom + ")",
Toast.LENGTH_LONG).show();
}
});
}
}
}
输出如下所示:
我刚刚试用了你的解决方案,非常酷。也许我错了,但我认为您的吐司输出中有一个输入错误:
mCallback.onRectFinished(new Rect(Math.min(mStartX, mEndX), Math.min(mStartY, mEndY),
Math.max(mEndX, mStartX), Math.max(mEndY, mStartX)));
必须是:
mCallback.onRectFinished(new Rect(Math.min(mStartX, mEndX), Math.min(mStartY, mEndY),
Math.max(mEndX, mStartX), Math.max(mEndY, mStartY)));
否则,底部的值有时计算错误 另一种方式:
从文档:
裁剪器是一种图像裁剪工具。它提供了一种设置
以XML和编程方式显示图像,并显示可调整大小的裁剪
窗口位于图像顶部。调用getCroppedImage()方法将
然后返回裁剪窗口标记的位图
开发人员可以自定义以下属性(通过XML和
(以编程方式):
裁剪窗口中的外观指导线是否显示纵横比
是否固定纵横比(如果纵横比固定)图像
资源一种公共方法,用于将图像旋转指定数量的
学位也包括在内。这可用于向用户提供
如果Android计算错误,修复图像方向的选项
预期方向
API级别7及以上支持
有关更多信息,请参见链接的Github Wiki页面
你需要“电话”坐标还是“图像”坐标(平均值,相对于真实图像大小)?@sandstar:相对于真实图像大小。即使是前者也会这样,因为我可以使用缩小图像的测量值计算图像上的实际坐标。谢谢!)是否有任何理由在ImageView顶部使用单独的DragRectView?我还通过扩展包含位图的ImageView类来实现它。这是个坏主意吗?我认为,扩展图像视图也不错。我使用单独视图只是为了在单独的实体中绘制矩形并跟踪其坐标。如果我需要计算图像坐标怎么办?需要进行哪些更改?然后需要存储图像大小,对标题进行校正,并乘以比例因子。我会更新代码来显示。是的,我认为这是正确的解决方案。抱歉耽搁了(请几天假)。
mCallback.onRectFinished(new Rect(Math.min(mStartX, mEndX), Math.min(mStartY, mEndY),
Math.max(mEndX, mStartX), Math.max(mEndY, mStartY)));