【问题标题】:How are input events associated to Views?输入事件如何与视图关联?
【发布时间】:2012-01-21 15:23:51
【问题描述】:

android 应用程序如何将事件与特定于哪个类和哪个方法的视图关联并输入事件?

【问题讨论】:

    标签: android view touch-event


    【解决方案1】:

    当屏幕被触摸时,MotionEvent 被调度到最顶层的 View(Activity 的内容视图)。内容视图然后对区域进行一些计算,并确定它是否具有能够接收 MotionEvent 的子级,并将 MotionEvent 通过onTouchEvent(MotionEvent) 传递给 MotionEvent 落入的视图。这在视图层次结构中重复,直到视图返回 true 或 MotionEvent 返回到顶层视图,此时它决定处理或丢弃它。 参考:

    View#onTouchEvent(MotionEvent)

    ViewGroup#onInterceptTouchEvent(MotionEvent)

    【讨论】:

    • 我希望有一种方法,如方法(视图,事件),我试图找到一个地方来拦截事件和它被传递到的视图......我不谈论听众
    • sdk 说窗口管理来自系统的输入到应用程序中我有 android 源代码你能指出这一切发生在哪里吗?
    • 好吧,onInterceptTouch 捕捉到了一个 MotionEvent,但并没有告诉你它正在发生(毕竟你拦截了它)。在我走得更远之前,你想做什么?如果不将目的地和事件传递给侦听器,为什么还需要知道它?
    • 我试图了解框架是如何工作的,我已经下载了源代码并正在跟踪输入是如何分派到视图的。到目前为止,我知道活动实现了一个回调接口,用于调度诸如 dispatchtoucheven 之类的方法,但是这个参数只有一个运动事件,我的问题是视图到底在哪里与视图相关联,具体来说是哪个类和哪些方法。谢谢!
    • 视图的正确尺寸取决于它的测量值和与视图关联的 LayoutParams。
    【解决方案2】:

    它使用观察者/监听者模式。您实现特定的接口,然后向 Android 平台注册。这就是 Android 平台知道调用哪个类和调用哪个方法的方式。

    由于我们使用接口作为媒介,所以Android平台知道调用哪些方法。该类是您提供的,可以通过创建匿名内部类或完整的类来提供。

    例子:

    button.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
              // You code
            }
        });
    

    现在 Android 将调用 View.OnClickListener 接口方法,并且您将类的实际实例作为参数传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多