我的视图大致定义为
class MyView1 extends LinearLayout {
// for debugging, not actually needed
@Override public boolean onTouchEvent(MotionEvent event) {
Log.d(getClass().getSimpleName(), "");
}
// also for debugging, not actually needed
@Override public boolean onInterceptTouchEvent(MotionEvent ev){
boolean handle = super.onInterceptTouchEvent(ev);
Log.v(getClass().getSimpleName(), "handle?=" + handle);
return handle;
}
}
}
和TouchListener / Behavior as
class TouchBehavior implements View.OnTouchListener {
View myView; // assigned in ctor
public void attach() { myView.setOnTouchListener( this ); }
@Override public boolean onTouch(View v, MotionEvent event) {
Log.d(getClass().getSimpleName(), "log just for detection");
// actual logic...
}
附加到MyView1
(通过日志记录验证)。由于我尚未确定的原因,此逻辑适用于另一个视图MyView2
(也扩展LinearLayout
)但不适用于MyView1
。在MyView1
onInterceptTouchEvent
中检测到onTouchEvent
触摸事件(点击布局内的任何位置),但未在TouchBehavior.onTouchEvent()
中检测到。 TouchBehavior
附加到MyView1
后永远不会调用onInterceptTouchEvent
,无论onTouchEvent
和MyView1
中是否定义了onInterceptTouchEvent()
和ViewGroup
。
来自Android文档' Managing Touch Events in a ViewGroup我的理解是true
在MyView1.onInterceptTouchEvent
中检测到触摸事件时调用MyView1.onTouchEvent
并且它可以返回MotionEvent
以表示它将拦截/消耗该事件,不要传播给它的孩子。在我的示例中,MyView1
使用其超类逻辑返回false,这意味着它可供自己或子级使用。但是,由于未调用MyView2
,我认为该事件由子子视图使用。
说完所有这些之后,也许这个问题对其他人来说是显而易见的,但它让我认为该事件是由子子视图或其中一个听众所消耗的,所以他们已经找到了确定最终结果的方法。那个View
的消费者。 MotionEvent
和[ngClass]
每个都有8-10个子视图(布局/小部件/等),并且在结构上非常不同。
那么如何确定哪个[ngClass]="counter>=20?'green':counter>=10?'orange':'red'"
消耗了一些输入事件(getColor(counter){
return counter>=20?'green':counter>=10?'orange':'red';
}
)?
答案 0 :(得分:0)
public class Myview extends LinearLayout {
public Myview(Context context) {
super(context);
}
public Myview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Myview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Toast.makeText(getContext(), "onTouchEvent", Toast.LENGTH_SHORT).show();
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Toast.makeText(getContext(), "onInterceptTouchEvent", Toast.LENGTH_SHORT).show();
boolean handle = super.onInterceptTouchEvent(ev);
return handle;
}
}
在上面的TouchBehavior类OnTouch
方法中,您应该返回false
如果您返回true,则只会触发onInterceptTouchEvent
方法。如果您返回false,则onInterceptTouchEvent
和onTouchEvent
将触发
答案 1 :(得分:0)
你可以这样做。在ViewGroup.dispatchTouchEvent
方法设置一个突破点。如果您使用的是SDK 25,则可以使用第2266行。child
View
有一个人使用触摸事件。
您还可以在那里配置断点,以便IDE将登录到控制台。