1

我在图像视图上有一个矢量/PNG 图像。我需要跟踪用户在图像上触摸的位置并标记点。我已经完成了这部分。但我面临一个问题。由于图像形状不规则,因此图像和图像视图(矩形)边界之间存在空间。

如果用户触摸图像视图而不是图像(即)边界之间的空间,则不应标记这些点。有没有办法做到这一点 ?


    imageView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {

                        modelWidth = selected_Car_Image.getWidth();
                        modelHeight = selected_Car_Image.getHeight();

                        float xTouchCoordinate = motionEvent.getX();
                        float yTouchCoordinate = motionEvent.getY();

                    return false;
                }
            });

        }

    <RelativeLayout
        android:id="@+id/carImageViewLayout"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="200dp"
            android:layout_height="400dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
    </RelativeLayout>

在此处输入图像描述

我使用 xTouchCoordinate 和 yTouchCoordinate 在用户触摸时绘制一个点。

在这个例子中,我不想跟踪用户在笔记本电脑外点击的任何点。但如果用户点击笔记本电脑,我需要这些点。

4

2 回答 2

0
imageView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                boolean isTouchOutSide = isOutSideTouch(view, motionEvent);
                return false;
         }
        });

并使用下面的函数找到 touchableArea

private boolean isOutSideTouch(View view, MotionEvent event) {
    int[] offset = new int[2];
    float[] values = new float[9];
    ImageView imageView = (ImageView) view;
    Matrix m = imageView.getImageMatrix();

    m.getValues(values);

    offset[0] = (int) values[Matrix.MTRANS_Y];
    offset[1] = (int) values[Matrix.MTRANS_X];
    float drawableWidth = imageView.getDrawable().getIntrinsicWidth();
    float drawableHeight = imageView.getDrawable().getIntrinsicHeight();
    float displayedWidth = drawableWidth * values[Matrix.MSCALE_X];
    float displayedHeight = drawableHeight * values[Matrix.MSCALE_Y];

    float topMargin = offset[0];
    float leftMargin = offset[1];

    RectF drawableRect = new RectF(
            leftMargin,
            topMargin,
            (leftMargin + displayedWidth),
            (topMargin + displayedHeight));
    return !drawableRect.contains(event.getX(), event.getY());
}

让我知道这是否有效。

于 2019-12-16T04:56:19.643 回答
0

首先,如果将计算 ImageView 大小以显示那些“白色区域”,则无法判断点击是否在图像上(笔记本电脑)。
所以基本上我们需要在布局上做一点改变——我们需要图像大小合适——我们可以通过多种方式实现这一点。
他们首先将使用wrap_contentforandroid:layout_widthandroid:layout_height。(使用硬编码值通常被认为是一个坏习惯)。如果图像显示正确,那么问题就解决了,如果没有,你可以使用scaleType属性,看看是否有什么适合你的。
您的问题的另一种可能的解决方案是android:adjustViewBounds="true"用于您的 ImageView - 在保留图像的纵横比时,视图将调整视图边界以填充可用空间 -官方文档,那么你不应该在那里使用硬编码值。

于 2019-12-14T23:28:12.050 回答