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中,但它仍然没有注册触摸事件。