Java 用于自定义视图的Android onTouchEvent

Java 用于自定义视图的Android onTouchEvent,java,android,Java,Android,我创建了一个在自定义线性布局中显示自定义视图的服务。服务工作正常,视图显示在屏幕上,但我无法让视图或线性布局接收任何触摸事件(我只希望其中任何一个接收触摸事件,我不在乎是哪一个)。这就是我所拥有的: MyLayout.java public class MyLayout extends LinearLayout { public MyLayout(Context context, AttributeSet attrs, int defStyle) { super(con

我创建了一个在自定义
线性布局中显示自定义
视图的服务。服务工作正常,
视图
显示在屏幕上,但我无法让
视图
线性布局
接收任何触摸事件(我只希望其中任何一个接收触摸事件,我不在乎是哪一个)。这就是我所拥有的:

MyLayout.java

public class MyLayout extends LinearLayout {

    public MyLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        onTouchEvent(ev);
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Toast.makeText(this.getContext(), "Touched layout", Toast.LENGTH_SHORT).show();
        Log.d("TOUCH", "Touched layout");
        return true;
    }
}
MyView.java

public class MyViewextends View{

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Toast.makeText(this.getContext(), "Touched View", Toast.LENGTH_SHORT).show();
        Log.d("TOUCH", "Touched View");
        return true;
    }
}

从SDK文档中:

onTouch()-返回一个布尔值,指示您的侦听器 消耗此事件。重要的是,这一事件可以 相互跟随的多个动作。所以,如果您在 如果接收到down action事件,则表示尚未接收 已消费事件,并且对后续操作也不感兴趣 从这次事件中。因此,您不会被要求采取任何其他行动 在事件中,如手指手势或最终的向上动作 事件

当触发ACTION_DOWN事件时,您需要返回true,以表明您对与该事件相关的后续调用感兴趣

如果需要在视图类中编写Android onTouchEvent方法,下面是一些示例源代码(样板/框架代码),说明如何实现此方法,包括如何在方法中使用MotionEvent,以及如何获取触摸事件的x和y位置:

public boolean onTouchEvent(MotionEvent event) {

    int eventAction = event.getAction();

    // you may need the x/y location
    int x = (int)event.getX();
    int y = (int)event.getY();

    // put your code in here to handle the event
    switch (eventAction) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_UP:
            break;
        case MotionEvent.ACTION_MOVE:
            break;
    }

    // tell the View to redraw the Canvas
    invalidate();

    // tell the View that we handled the event
    return true;

}
我对代码进行了注释,我认为它显示了使用此方法的最常见方式,因此我不想在这里添加任何解释。我演示了如何获取触摸事件的x和y位置,因为您通常需要检查事件发生的位置

总之,如果您想看到一个示例AndroidOnTouchEvent方法(在视图类中),我希望这个示例会有所帮助


ref:

您的视图未接收到任何触摸事件,因为您的自定义LinearLayout正在阻止事件,因为它不会将事件发送到其子视图

我不太清楚为什么您要覆盖
MyLayout
中的
onInterceptTouchEvent()
onTouchEvent()
,但是如果您不需要它们,我建议将它们都删除,这样布局就有了处理触摸事件的默认行为

如果您真的需要它们,您可能需要调用每种方法的
super
方法:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Toast.makeText(this.getContext(), "Touched layout", Toast.LENGTH_SHORT).show();
    Log.d("TOUCH", "Touched layout");
    return super.onTouchEvent(event);
}

谢谢你的回复。如果我可以让我的
LinearLayout
接收事件,这很好,但是当我触摸它时,土司和日志不会显示出来。我试着做了你建议的更改,但仍然不起作用。谢谢你的回复,我试过了,但没有起作用。无论是
线性布局
还是
视图
都没有注册触摸事件。在xml集合中,android:clickable=“true”我为
MyLayout
MyView
将其添加到xml中,但它仍然没有注册触摸事件。