[英]Android onTouchEvent for custom view
我创建了一个在自定义LinearLayout
内显示自定义View
的服务。 该服务运行良好,并且View
显示在屏幕上,但是我无法让View
或LinearLayout
接收任何触摸事件(我只希望其中一个接收触摸事件,我不在乎)。 这就是我所拥有的:
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.