繁体   English   中英

Android onTouchEvent用于自定义视图

[英]Android onTouchEvent for custom view

我创建了一个在自定义LinearLayout内显示自定义View的服务。 该服务运行良好,并且View显示在屏幕上,但是我无法让ViewLinearLayout接收任何触摸事件(我只希望其中一个接收触摸事件,我不在乎)。 这就是我所拥有的:

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()-返回一个布尔值,指示您的侦听器是否使用此事件。 重要的是,此事件可以有多个彼此跟随的动作。 因此,如果在收到按下动作事件时返回false,则表明您尚未消耗该事件,并且也对该事件的后续动作不感兴趣。 因此,不会在事件内要求您进行其他任何操作,例如手指手势或最终的上动作事件。

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

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

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位置,因为您通常需要检查一下事件发生的位置。

因此,总而言之,如果您想查看示例Android onTouchEvent方法(在View类中),希望此示例对您有所帮助。

参考: http : //alvinalexander.com/android/android-ontouchevent-example-method-view-class

您的View没有收到任何触摸事件,因为您的自定义LinearLayout阻止了事件,因为它没有将事件调度到其子View。

我不太确定为什么要覆盖onInterceptTouchEvent()onTouchEvent() MyLayout ,但是如果您不需要它们,我建议将它们都删除,因此该布局具有处理触摸事件的默认行为。 。

如果确实需要它们,则可能必须调用每个方法的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);
}

暂无
暂无

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

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