在基于Android视图的课程中聆听触摸事件

时间:2013-03-10 18:24:34

标签: android ontouchevent ontouchlistener

从android.view.View派生类时,我看到有3种处理触摸事件的可能性:

  1. 使用setOnTouchListener方法添加侦听器实例
  2. 覆盖View.onTouchEvent方法
  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;
        }
    }
    
  4. 这些替代方案似乎也有同样的目的。唯一明显的区别是使用OnTouchListener时额外的View参数 - 因此可以监听不同的视图(在这种情况下,将使用非匿名侦听器)。但在我的场景中不需要这样做;我只是想听一下我的ExtendedView实例的事件。

    我使用 - 取得了一些成功 - 替代2,覆盖onTouchEvent。在我看来,覆盖现有方法是完成任务的最自然,最简单的方法。

    我在这里的原因是:我看到View派生类使用setOnTouchListener来设置额外的侦听器而不是覆盖onTouchEvent的代码。

    所以我的问题是:

    1. 我想念一下吗?
    2. 当从View?派生时,
    3. 是替代的1(和3)

      额外奖励问题:View不实现OnTouchListener接口,但具有onTouchEvent方法。为什么?对于View而言,实现此接口而不是使用onTouchEvent方法会不会更加一致?


      PS:我找到了关于这个问题的讨论:

      Where should I implement the Android onTouchListener?

      坦率地说,我不明白接受的答案:“edthethird”写了关于覆盖onTouchEvent:

        

      实例化只有一个额外的类......

      哪个额外课程 - 我没有看到一个。

      在onTouchEvent实现中,他将一个事件与一个视图进行比较 - 这对我来说没有多大意义。此外,他假设不同的视图将调用onTouchEvent - 但是 - 如果我理解覆盖方法正确 - 这将不会发生。

      -

      “BeatingToADifferentRobot”写道“... setOnTouchListener [..]提供了更多的灵活性,并遵循一般的java模式”

      我不能这样做。那会更灵活吗?我总是可以从类派生并覆盖方法。

      覆盖一个方法 - 希望 - 没有“不遵循一般的java模式”

0 个答案:

没有答案