获取相对于自定义 ImageView 的触摸坐标

Get Touch Coordinates Relative To A Custom ImageView

我实现了自定义 ImageView。因为我的图像很大,所以我使用 ScrollView 和 Horizo​​ntalScrollView 来滚动图像。我想在 onTouch 事件中画圆圈,但并非在所有情况下都有效。当我滚动图像并触发触摸事件时,x、y 坐标适用于图像的当前可见部分(在右上角,例如 0x0,但是当我滚动某处并且在可见的上角时,它也将是 0x0),但是圆圈正在绘制根据图像大小。 另一个问题是应用程序可以在各种屏幕尺寸上使用。 我知道它是 xamarin c#,但在本机 Android 中它应该是相同的。有人知道如何 draw/get 正确坐标吗?

public class DrawViewInside : ImageView
{

    public static Bitmap bitmapInside;
    private Paint paint = new Paint();
    private Point point = new Point();

    private Canvas mCanvas;
    private static Bitmap mutableBitmap;
    private Context mContext;
    public static Bitmap b;
    public void SetCarId(int id)
    {
        carId = id;
    }
    public DrawViewInside(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        mContext = context;
        setDefault(drawable);
    }

    public void SetBitmap(int drawableId)
    {
        setDefault(drawableId);
        Invalidate();
    }


    protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        base.OnMeasure(widthMeasureSpec, heightMeasureSpec);

        int width = MeasureSpec.GetSize(widthMeasureSpec);
        int height = width;

        var metrics = Resources.DisplayMetrics;
        if (b != null)
        {
            SetMeasuredDimension(b.Width, b.Height);
        }

    }


    public async void setDefault(int drawableId)
    {


            BitmapFactory.Options options = await GetBitmapOptionsOfImage(drawableId);
            paint.Color = Color.Red;
            paint.StrokeWidth = 15;
            paint.SetStyle(Paint.Style.Stroke);
            var metrics = Resources.DisplayMetrics;
            var widthInDp = ConvertPixelsToDp(metrics.WidthPixels);
            var heightInDp = ConvertPixelsToDp(metrics.HeightPixels);

            b = BitmapFactory.DecodeResource(Resources, drawableId);esources, drawableId);
            mutableBitmap = b.Copy(Bitmap.Config.Argb8888, true);
            mCanvas = new Canvas(mutableBitmap);
            mCanvas.Save();

    }


    protected override void OnDraw(Canvas canvas)
    {
        DrawCircle(canvas);


    }
    private void DrawCircle(Canvas canvas)
    {
        if (mCanvas == null)
        {
            setDefault(drawable);
        }
        else
        {
            mCanvas.Restore();
            mCanvas.DrawCircle(point.x, point.y, 10, paint);
            mCanvas.Save();
            canvas.DrawBitmap(mutableBitmap, 0, 0, paint);
            bitmapInside = mutableBitmap;
        }


    }

    public override bool OnTouchEvent(MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:

                break;

            case MotionEventActions.Up:
                        Activity act = (Activity)mContext;

                        float viewX = e.RawX - this.Left;
                        float viewY = e.RawY - this.Top;
                        point.x = viewX;// e.RawX;
                        point.y = viewY;// e.RawY;

                    break;
                }
        Invalidate();
        return true;

    }

}
public class Point
{
    public float x, y;
}

我找到了解决方案。只需替换

                   float viewX = e.RawX - this.Left;
                    float viewY = e.RawY - this.Top;
                    point.x = viewX;// e.RawX;
                    point.y = viewY;// e.RawY;

                       float viewX = e.RawX;// - this.Left;
                        float viewY = e.RawY;// - this.Top;
                        int[] viewCoords = new int[2];
                        this.GetLocationOnScreen(viewCoords);
                        point.x = viewX - viewCoords[0];// e.RawX;
                        point.y = viewY - viewCoords[1];// e.RawY;