我该在哪里实现Android的onTouchListener?

3

我是一名新手Android开发者,目前我必须决定在哪里控制手势输入,但我不知道从哪里获取触摸输入的优缺点。我已经得到了两种选择,你能否请解释一下这两种方式的优缺点?

在View上设置监听器; 实现方法:

faceView.setOnTouchListener(new OnTouchListener(){
   public boolean onTouch(View arg0, MotionEvent arg1){
     return false;
   }
);

在视图中重写方法

public boolean onTouchEvent(MotionEvent event){
   return false;
}
3个回答

2

方法1:匿名内部类型。

faceView.setOnTouchListener(new OnTouchListener(){
   public boolean onTouch(View arg0, MotionEvent arg1){
     return false;
   } 
);

这是一个匿名的声明,因为它没有名称。没有OnTouchListener mytouch =,只有声明new OnTouchListener()。这是内部类,因为它在另一个类内部,并且它是一种类型,因为它是接口的实现。
所以,考虑到这一点。这种方法对开发人员来说更加方便。功能是隔离的(通常通过listenerable的声明),这很容易管理。但这种便利是有代价的。假设您有按钮,带有十个onClickListeners。使用这种方法,每个新的匿名内部类型都会使垃圾收集队列更快地填满。
但这重要吗?不太重要。如果您想从系统中获得每微秒的性能,那么确实不要使用此方法。但一般来说,这是可行的。
方法2:单继承
public boolean onTouchEvent(MotionEvent event){
   return false;
} 

假设您已经阅读了上面的内容,这种方法在创建和清除方面的成本要低得多。只有一个额外的类被实例化,并且只有一个对象被添加到垃圾回收队列中。
这是我使用的方法,也是我用了一段时间的方法。这也是我在 Google 的示例源代码中看到的方法。
但它并不完美! onTouchEvent 的实现将最终看起来如下:
public void onTouch(Event e){
if (e.equals(View1)){
}else if (e.equals(View2)){
}else if (e.equals(View 3)){
...}

SO

说实话,这并不重要。如果您想获得最高的性能,请使用静态的onTouchEvent监听器,这样您就不必支付上述费用,但大多数情况下它们并不那么昂贵。


0

我个人会使用监听器,在你的onCreate方法中使用它,现在应该没问题了。


0
在大多数情况下,您可能会使用setOnTouchListener,因为它提供了更多的灵活性并遵循通用的Java模式。通常,仅在触摸事件始终发生在视图内且触摸事件不会更改的情况下才会重写onTouchEvent。您还必须定义View类以覆盖onTouchEvent。当使用像按钮这样的东西时,没有必要实现自己的按钮类来处理单击事件!

faceView.setOnTouchListener

优点

  • 允许轻松定制
  • 遵循普遍接受的Java模式

缺点

  • 如果行为不改变,可能会导致不必要的setter。

覆盖onTouchEvent

优点

  • 将功能封装在基类中

缺点

  • 不允许定制

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接