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