繁体   English   中英

当手指在自定义视图上时获取 xy 坐标

[英]Get x y coordinates while the finger is on the custom View

我创建了自定义视图。

当我的手指在此视图上时,我需要获取 X 和 Y 坐标。

为此,我使用了onTouchEvent方法,但由于某种原因它被触发了一次,我不明白为什么。

可能是什么问题呢?


我的自定义视图:

public class MyCustomView extends View {

private int layoutWidth, layoutHeight = 0;
private radius = 0;
private isInit = false;


public MyCustomView(Context context) {
    super(context);
}

public MyCustomView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
}

public MyCustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


private void initMyCustomView() {
    layoutWidth = getWidth();
    layoutHeight = getHeight();
    radius = Math.min(height, width) / 2;
    isInit = true;
}

@Override
protected void onDraw(Canvas canvas) {
    if (!isInit) initMyCustomView();

    drawCircle(canvas);

    postInvalidateDelayed(500);
    invalidate();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d("LOGD", "onTouchEvent");

    return true;
}

private void drawCircle(Canvas canvas) {
    Paint paint = new Paint();
    paint.setColor(getResources().getColor(android.R.color.white));
    paint.setStrokeWidth(5);
    paint.setStyle(Paint.Style.STROKE);
    paint.setAntiAlias(true);
    canvas.drawCircle(layoutWidth / 2, layoutHeight / 2, radius, paint);
}
}

解决:

问题是onTouchEvent有效,但是如果您将手指移到按下点的上方或下方,它就会停止工作。

事实证明,如果您的CustomView (或任何其他ViewLayout等)被放置在NestedScrollView 中,就会发生这种情况。

这很容易修复,您只需要添加行getParent().requestDisallowInterceptTouchEvent(true); onTouchEvent 中

@Override
public boolean onTouchEvent(MotionEvent event) {

    getParent().requestDisallowInterceptTouchEvent(true);

    return true;
}

invalidate(); postInvalidateDelayed(500); 将反复调用 onDraw 方法,您的代码将永远陷入无限循环。

在这里,是您的代码的优化版本。 试一试。

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

public class MyCustomView extends View {

    private int layoutWidth, layoutHeight = 0;
    private int radius = 0;
    private boolean isInit = false;
    private Paint paint;

    public MyCustomView(Context context) {
        super(context);
        init();
    }

    public MyCustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyCustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // avoid object creation on onDraw method
        paint = new Paint();
        paint.setColor(getResources().getColor(android.R.color.white));
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //Handle view size change
        initMyCustomView();
    }

    private void initMyCustomView() {
        layoutWidth = getWidth();
        layoutHeight = getHeight();
        radius = Math.min(layoutWidth, layoutHeight) / 2;
        isInit = true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (!isInit) initMyCustomView();

        drawCircle(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("LOGD", "onTouchEvent:"+event.getX()+","+event.getY());
        float x = event.getX();
        float y = event.getY();

        return true;
    }

    private void drawCircle(Canvas canvas) {
        canvas.drawCircle(layoutWidth / 2, layoutHeight / 2, radius, paint);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM