android - 我应该在哪里实现 Android onTouchListener?

标签 android touch-event ontouchlistener

我是 Android 开发的新手,目前我必须决定在哪里控制手势输入,但我只是不知道在哪里抓取触摸输入的优缺点。我有两种选择,你能给我解释一下这两种方法的优缺点吗?

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

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

在 View 中覆盖方法

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

最佳答案

方法 1:匿名内部类型。

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

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

好的,考虑到这一点。这种方式对开发者来说更​​方便。功能是隔离的(通常通过 listenerable 的声明)并且这很容易管理。但这种便利是有代价的。假设您有按钮和十个 onClickListeners。使用这种方法,垃圾收集队列将更快地被每个新的匿名内部类型填满。

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

方法 2:单一继承

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

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

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

但这并不完美! onTouchEvent 的实现最终看起来是这样的:

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

所以

老实说,没关系。如果您想要尽可能高的性能,请使用静态 onTouchEvent 监听器,并且您不必支付上述成本,但在大多数情况下它们并不昂贵。

关于android - 我应该在哪里实现 Android onTouchListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492573/

相关文章:

android - 尝试添加 MultiDex 支持 - 找不到符号上下文和 MultiDex

javascript - Canvas获取图像的触摸事件

android - 将触摸事件传递到下方 View 取决于上方 View 触摸

Android 在 ScrollView 滚动时禁用子 onTouch

Android ProgressDialog 进度条按正确的顺序做事

java - 如何在 Android 中创建可重用的代码 fragment ?

安卓多点触控

android - 如果用户在 ViewPager 中向左或向右滑动,是否可以拦截触摸事件并转移到 ListView

java - 按住按钮可以平滑地增加速度更改值

android - Fragment 中处理信息的通知 Activity