网站首页 > 教程分享 正文
今天的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方法。我固然知道回调和监听不同,但是它们绝对不会是两种方法。
猜你喜欢
- 2024-10-14 APP安全学习资料收集(app安全隐患)
- 2024-10-14 Android 开发学习笔记:七大知识点板块汇总
- 2024-10-14 2019 学习 Android 看这些就够了!
- 2024-10-14 Android程序员的Java后台学习建议
- 2024-10-14 加精经验分享!Android入门怎么学(想学android)
- 2024-10-14 终于有人把安卓程序员必学知识点全整理出来了,有如醍醐灌顶
- 2024-10-14 从应用层深入Framework层,Android Framework 该如何学习?
- 2024-10-14 Android Jetpack从入门到精通(深度好文,值得收藏)
- 2024-10-14 Android平台开发学习实践(android开发实战)
- 2024-10-14 Android 菜鸟的学习之路——MVVMHabit(一)
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)