从android.view.View派生类时,我看到有3种处理触摸事件的可能性:
在派生视图中实现OnTouchListener
class ExtendedView extends View {
public ExtendedView(Context context) {
super(context);
// 1. set a listener
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
});
}
// 2. override onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return super.onTouchEvent(event);
}
}
// 3. implement and use OnTouchListener
class ExtendedView3 extends View implements OnTouchListener {
public ExtendedView3(Context context) {
super(context);
setOnTouchListener(this);
}
// not override this
// public boolean onTouchEvent() {...}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
}
这些替代方案似乎也有同样的目的。唯一明显的区别是使用OnTouchListener时额外的View参数 - 因此可以监听不同的视图(在这种情况下,将使用非匿名侦听器)。但在我的场景中不需要这样做;我只是想听一下我的ExtendedView实例的事件。
我使用 - 取得了一些成功 - 替代2,覆盖onTouchEvent。在我看来,覆盖现有方法是完成任务的最自然,最简单的方法。
我在这里的原因是:我看到View派生类使用setOnTouchListener来设置额外的侦听器而不是覆盖onTouchEvent的代码。
所以我的问题是:
额外奖励问题:View不实现OnTouchListener接口,但具有onTouchEvent方法。为什么?对于View而言,实现此接口而不是使用onTouchEvent方法会不会更加一致?
PS:我找到了关于这个问题的讨论:
Where should I implement the Android onTouchListener?
坦率地说,我不明白接受的答案:“edthethird”写了关于覆盖onTouchEvent:
实例化只有一个额外的类......
哪个额外课程 - 我没有看到一个。
在onTouchEvent实现中,他将一个事件与一个视图进行比较 - 这对我来说没有多大意义。此外,他假设不同的视图将调用onTouchEvent - 但是 - 如果我理解覆盖方法正确 - 这将不会发生。
-
“BeatingToADifferentRobot”写道“... setOnTouchListener [..]提供了更多的灵活性,并遵循一般的java模式”
我不能这样做。那会更灵活吗?我总是可以从类派生并覆盖方法。
覆盖一个方法 - 希望 - 没有“不遵循一般的java模式”