【问题标题】:Is there a way to find whether the touch is only on the image in the image view?有没有办法在图像视图中查找触摸是否仅在图像上?
【发布时间】:2019-12-13 10:39:52
【问题描述】:

我在图像视图上有一个矢量/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 绘制一个点。

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

【问题讨论】:

  • 你能添加你的代码吗?
  • 用代码更新了问题
  • 请添加视图 xml,如果可能的话,添加实际图像 :) 您可以随时在您的设备上制作屏幕截图,并在开发人员选项中启用“显示视图边界”,这将极大地帮助我们回答您的问题。
  • @kolboc 我已经更新了问题

标签: android android-layout imageview touch-event touchimageview


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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());
    }
    

    让我知道这是否有效。

    【讨论】:

    • 只有在我正确理解这一点的情况下,这才适用于矩形图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多