Android开发学习之路-记一次CSDN公开课
2016-07-20 21:49
651 查看
今天的CSDN公开课Android事件处理重难点快速掌握中老师讲到一个概念我觉得不正确。
原话是这样的:点击事件可以通过事件监听和回调两种方法实现。
我一听到之后我的表情是这样的:
这跟我学的看的都不一样啊,这还分监听和回调。这个时候我立马提出问题,嗯,讲课老师看到了。
老师就说了:是不一样的,我们第四点(最后一点)会讲。
好,我立马坐好准备受教听了大半小时。听到最后我的表情是这样的:
废话说够了,开个小玩笑,不要见怪。
我们都知道,监听事件其实只有一种,就是回调。如果有人不明白什么是回调?可以看看我的一篇文章中的开头那个例子:回调学习笔记
我们以Button为例,Button是View的子类这个毋庸置疑,所以我们直接看View中的源码:
这里很简单,只是把一个OnClickListener的具体子类保存起来而已。当我们点击按钮的时候,系统必然会回调onTouchEvent这个方法,而在View中这个方法是这样的:
这里我删除了很多代码,我们知道一个点击是由一个ACTION_DOWN、若干个ACTION_MOVE和一个ACTION_UP组成的,也就是说,当点击完成,会执行ACTION_UP中的代码。在第32行中,调用了一个方法叫做performClick,这个方法就是直接执行点击事件的,我们看到这个方法的内部:
第6行中,调用了我们传进来的那个接口的实现类中的onClick方法,这就是回调,因为这不是真正的调用。
总结:无论是什么监听事件,都是通过回调来实现的。我们点击之后,事件由系统捕获,有底层控件逐步上传到控件,然后回调给View的onTouchEvent方法,这个方法回调给我们设置的接口中onClick方法。我固然知道回调和监听不同,但是它们绝对不会是两种方法。
原话是这样的:点击事件可以通过事件监听和回调两种方法实现。
我一听到之后我的表情是这样的:
这跟我学的看的都不一样啊,这还分监听和回调。这个时候我立马提出问题,嗯,讲课老师看到了。
老师就说了:是不一样的,我们第四点(最后一点)会讲。
好,我立马坐好准备受教听了大半小时。听到最后我的表情是这样的:
废话说够了,开个小玩笑,不要见怪。
我们都知道,监听事件其实只有一种,就是回调。如果有人不明白什么是回调?可以看看我的一篇文章中的开头那个例子:回调学习笔记
我们以Button为例,Button是View的子类这个毋庸置疑,所以我们直接看View中的源码:
public void setOnClickListener(@Nullable OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; }
这里很简单,只是把一个OnClickListener的具体子类保存起来而已。当我们点击按钮的时候,系统必然会回调onTouchEvent这个方法,而在View中这个方法是这样的:
public boolean onTouchEvent(MotionEvent event) { final float x = event.getX(); final float y = event.getY(); final int viewFlags = mViewFlags; final int action = event.getAction(); // 代码省略 if (((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) || (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE) { switch (action) { case MotionEvent.ACTION_UP: boolean prepressed = (mPrivateFlags & PFLAG_PREPRESSED) != 0; if ((mPrivateFlags & PFLAG_PRESSED) != 0 || prepressed) { boolean focusTaken = false; if (isFocusable() && isFocusableInTouchMode() && !isFocused()) { focusTaken = requestFocus(); } if (prepressed) { setPressed(true, x, y); } if (!mHasPerformedLongPress && !mIgnoreNextUpEvent) { if (!focusTaken) { if (mPerformClick == null) { mPerformClick = new PerformClick(); } if (!post(mPerformClick)) { performClick(); } } } if (mUnsetPressedState == null) { mUnsetPressedState = new UnsetPressedState(); } if (prepressed) { postDelayed(mUnsetPressedState, ViewConfiguration.getPressedStateDuration()); } else if (!post(mUnsetPressedState)) { mUnsetPressedState.run(); } removeTapCallback(); } mIgnoreNextUpEvent = false; break; case MotionEvent.ACTION_DOWN: // 代码省略 break; case MotionEvent.ACTION_CANCEL: // 代码省略 break; case MotionEvent.ACTION_MOVE: // 代码省略 break; } return true; } return false; }
这里我删除了很多代码,我们知道一个点击是由一个ACTION_DOWN、若干个ACTION_MOVE和一个ACTION_UP组成的,也就是说,当点击完成,会执行ACTION_UP中的代码。在第32行中,调用了一个方法叫做performClick,这个方法就是直接执行点击事件的,我们看到这个方法的内部:
public boolean performClick() { final boolean result; final ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); li.mOnClickListener.onClick(this); result = true; } else { result = false; } sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); return result; }
第6行中,调用了我们传进来的那个接口的实现类中的onClick方法,这就是回调,因为这不是真正的调用。
总结:无论是什么监听事件,都是通过回调来实现的。我们点击之后,事件由系统捕获,有底层控件逐步上传到控件,然后回调给View的onTouchEvent方法,这个方法回调给我们设置的接口中onClick方法。我固然知道回调和监听不同,但是它们绝对不会是两种方法。
相关文章推荐
- Android开发中Handler的经典总结
- Android LayoutInflater详解
- Android源码中的代理模式解析
- Android坐标系相关
- Android平滑图片加载和缓存库 Glide 使用详解
- Android fontawesome-webfont.ttf字体库的使用
- Android流式布局实现
- Android 仿联系人字母索引
- Android 仿qq侧拉菜单
- 各种android定时器验证
- [android] 安卓自定义样式和主题
- Android 自定义toggleButton
- android的DeepLink
- android沉浸式
- android欢迎页通知栏隐藏
- 《android开发艺术探索》笔记之Bitmap的加载和Cache
- Android Activity的四大启动模式
- [Android] ImageView.ScaleType设置图解
- android 中ListView Adapter内所蕴含的观察者模式
- android屏幕录制和转gif