百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Android开发学习之路-记一次CSDN公开课

xsobi 2024-12-28 16:18 1 浏览

今天的CSDN公开课Android事件处理重难点快速掌握中老师讲到一个概念我觉得不正确。

原话是这样的:点击事件可以通过事件监听和回调两种方法实现

我一听到之后我的表情是这样的:

这跟我学的看的都不一样啊,这还分监听和回调。这个时候我立马提出问题,嗯,讲课老师看到了。

老师就说了:是不一样的,我们第四点(最后一点)会讲。

好,我立马坐好准备受教听了大半小时。听到最后我的表情是这样的:

废话说够了,开个小玩笑,不要见怪。

我们都知道,监听事件其实只有一种,就是回调。如果有人不明白什么是回调?可以看看我的一篇文章中的开头那个例子:回调学习笔记

我们以Button为例,Button是View的子类这个毋庸置疑,所以我们直接看View中的源码:

    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable) {
 setClickable(true);
        }
        getListenerInfo.mOnClickListener = l;
    }

这里很简单,只是把一个OnClickListener的具体子类保存起来而已。当我们点击按钮的时候,系统必然会回调onTouchEvent这个方法,而在View中这个方法是这样的:

 1     public boolean onTouchEvent(MotionEvent event) {
 2         final float x = event.getX;
 3         final float y = event.getY;
 4         final int viewFlags = mViewFlags;
 5         final int action = event.getAction;
 6 
 7        // 代码省略
 8 
 9         if (((viewFlags & CLICKABLE) == CLICKABLE ||
10 (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) ||
11 (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE) {
12 switch (action) {
13 case MotionEvent.ACTION_UP:
14 boolean prepressed = (mPrivateFlags & PFLAG_PREPRESSED) != 0;
15 if ((mPrivateFlags & PFLAG_PRESSED) != 0 || prepressed) {
16 boolean focusTaken = false;
17 if (isFocusable && isFocusableInTouchMode && !isFocused) {
18 focusTaken = requestFocus;
19  }
20 
21 if (prepressed) {
22 setPressed(true, x, y);
23  }
24 
25 if (!mHasPerformedLongPress && !mIgnoreNextUpEvent) {
26 if (!focusTaken) {
27 
28 if (mPerformClick == null) {
29 mPerformClick = new PerformClick;
30  }
31 if (!post(mPerformClick)) {
32  performClick;
33  }
34  }
35  }
36 
37 if (mUnsetPressedState == null) {
38 mUnsetPressedState = new UnsetPressedState;
39  }
40 
41 if (prepressed) {
42  postDelayed(mUnsetPressedState,
43  ViewConfiguration.getPressedStateDuration);
44 } else if (!post(mUnsetPressedState)) {
45  mUnsetPressedState.run;
46  }
47 
48  removeTapCallback;
49  }
50 mIgnoreNextUpEvent = false;
51 break;
52 
53 case MotionEvent.ACTION_DOWN:
54 // 代码省略
55 break;
56 
57 case MotionEvent.ACTION_CANCEL:
58 // 代码省略
59 break;
60 
61 case MotionEvent.ACTION_MOVE:
62 // 代码省略
63 break;
64  }
65 
66 return true;
67         }
68 
69         return false;
70     }

这里我删除了很多代码,我们知道一个点击是由一个ACTION_DOWN、若干个ACTION_MOVE和一个ACTION_UP组成的,也就是说,当点击完成,会执行ACTION_UP中的代码。在第32行中,调用了一个方法叫做performClick,这个方法就是直接执行点击事件的,我们看到这个方法的内部:

 1     public boolean performClick {
 2         final boolean result;
 3         final ListenerInfo li = mListenerInfo;
 4         if (li != null && li.mOnClickListener != null) {
 5  playSoundEffect(SoundEffectConstants.CLICK);
 6 li.mOnClickListener.onClick(this);
 7 result = true;
 8         } else {
 9 result = false;
10         }
11 
12         sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
13         return result;
14     }

第6行中,调用了我们传进来的那个接口的实现类中的onClick方法,这就是回调,因为这不是真正的调用。

总结:无论是什么监听事件,都是通过回调来实现的。我们点击之后,事件由系统捕获,有底层控件逐步上传到控件,然后回调给View的onTouchEvent方法,这个方法回调给我们设置的接口中onClick方法。我固然知道回调和监听不同,但是它们绝对不会是两种方法。

相关推荐

C++中的多态(动态多态)究竟是如何实现

为了叙述简便,在本文中,将动态多态性一律简化为多态性。在前面的文章中,我们已经简要介绍了C++的多态性,也介绍了C++的虚函数表,下面,我们来看看C++是如何利用虚函数机制来实现多态性的。(题外话:实...

C++面向对象开发的四大特性:封装、抽象、继承、多态

1、封装封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制程序对类属性的读取和修改。对于类的内部,成员函数可以自由修改成员变量,进行更精确的控制;对于类的外部,良好的封装能够减少耦合,同时隐藏实现...

C#知识|继承与多态

哈喽,你好啊,我是雷工01ProtectedProtected关键字表示这个属性只能给“子类”使用,即只能在子类内部使用,不能通过子类对象去使用;02父类定义父类...

朝文分享(54):深入C++(二十一)——多态

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。...

C++基础语法梳理:引用、封装、继承和多态

本期是C++基础语法分享的第六节,今天给大家来分享一下:(1)引用;...

继承和多态概念及语法

继承是面向对象编程的重要概念之一,它指的是一个类可以从另一个类中继承属性和方法。...

Java的多态如何实现的?

面向对象编程语言三大特征:继承、封装、多态。虽说是三大特征,但其实从多态的角度看,继承和封装都是为了实现多态而准备的,尤其是在一些大型优秀的框架上,多态的使用随处可见,所以说多态是一个十分重要的知识点...

C++中的多态性

封装、继承、多态是C++的三大基本特性。封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);封装和继承的目的都是为了"代码重用",多态则是为了实现另一个目的:接口...

讲解一下Java 中的多态

多态(Polymorphism)属于面向对象三大特征之一,它的前提是封装形成独立体,独立体之间存在继承关系,从而产生多态机制。多态是同一个行为具有多个不同表现形式或形态的能力。重载式多态,也叫编译时多...

java编程笔记,多态的好处和弊端

测试代码:1.创建Animal.java类作为父类2.创建Cat.java类作为Animal的子类3.创建一个Dog.java类作为Animal的子类4.创建Test.java测试类代码说明:多态的好...

C/C++编程笔记:C++多态性知识详解

多态性一词意味着具有多种形式。简而言之,我们可以将多态定义为消息以多种形式显示的能力。一个真实的多态示例:一个人同时可以具有不同的特征。像男人一样,是父亲,丈夫,雇员。因此,同一个人在不同情况下会表现...

用通俗易懂的多态世界观实例:理解python类的多态

什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态...

多态——制作饮品

classAbstractDrinking{public://煮水virtualvoidBoil(){cout<<"煮农夫山泉"<&...

python之多态、继承、重写篇

#-*-coding:UTF-8-*-classAnimal:defrun(self):print("动物会跑。。")defsl...

Java面向对象——多态

前两天已经相继介绍了Java面向对象的三大特性之中的封装、继承,所以今天就介绍Java面向对象的三大特性的最后一项,多态~首先讲一下什么是多态,以及多态需要注意的细节什么是多态:一个对象具备多种...