我应该在哪里实现Android onTouchListener?

时间:2012-02-29 02:01:08

标签: android ontouchevent ontouchlistener

我是Android开发的新手,目前我必须决定在何处控制手势输入,但我不知道在哪里抓取触摸输入的优缺点。我有两种选择,你可以向我解释两种方式的优点和缺点吗?

在View上设置侦听器;实施方法:

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

在视图

中覆盖方法
public boolean onTouchEvent(MotionEvent event){
   return false;
}

3 个答案:

答案 0 :(得分:2)

方法1:匿名内部类型。

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

这是匿名的,因为它是一个没有名字的声明。没有OnTouchListener mytouch =,只有声明new OnTouchListener()。这是内部的,因为它在另一个类中,它是一个类型,因为它是一个接口的实现。

好的,所以记住这一点。这种方法对开发人员来说更方便。功能被隔离(通常通过声音的声明),这很容易管理。但这种便利需要付出代价。假设您有按钮,有10个onClickListeners。使用这种方法,垃圾收集队列将更快地填充每个新的匿名内部类型。

但这有关系吗?并不是的。如果您试图从系统中获得每微秒的性能,那么一定不要使用这种方法。但一般来说,这是可行的。

方法2:单一继承

public boolean onTouchEvent(MotionEvent event){
   return false;
} 

假设您已阅读上述内容,此方法的创建和清理成本要低得多。实例化只有一个额外的类,并且只有一个对象添加到GC队列。

这是我使用的方法,已经使用了一段时间。这也是我在Google的示例源代码中看到的内容。

但它并不完美! onTouchEvent的实施最终将如此:

public void onTouch(Event e){
if (e.equals(View1)){
}else if (e.equals(View2)){
}else if (e.equals(View 3)){
...}

SO

老实说,没关系。如果您希望获得最高性能,请使用静态onTouchEvent监听器,您不必支付上述费用,但大多数情况下它们并不昂贵。

答案 1 :(得分:0)

我个人会使用听众,只需在你的onCreate方法中使用它,现在应该没问题

答案 2 :(得分:0)

在大多数情况下,您可能会使用setOnTouchListener,因为它提供了更大的灵活性并遵循一般的Java模式。通常,重写onTouchEvent只会用于始终出现在View中的touchevents和不会改变的touchevents。您还必须定义View类以覆盖onTouchEvent。当使用像按钮这样的东西时,为了处理点击事件而必须实现你自己的按钮类是没有意义的!

faceView.setOnTouchListener

  • 允许轻松自定义
  • 遵循普遍接受的java模式

缺点

  • 如果行为没有改变,可能会导致不必要的设置者。

覆盖onTouchEvent 临

  • 封装基类中的功能

缺点

  • 不允许自定义