diff --git a/README.md b/README.md index a0e90f4..a4187bb 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Android Notes 9. [Serializable 与 Parceable](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Serializable%20%E4%B8%8E%20Parceable.md) 10. [轻松入门 Socket 编程](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Socket%20%E7%BC%96%E7%A8%8B.md) 11. [热修复](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E7%83%AD%E4%BF%AE%E5%A4%8D.md) +12. [事件分发机制](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E6%9C%BA%E5%88%B6.md) ##### 性能优化 diff --git a/blogs/Android/Serializable 与 Parceable.md b/blogs/Android/Serializable 与 Parceable.md deleted file mode 100644 index ad672a2..0000000 --- a/blogs/Android/Serializable 与 Parceable.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -Serializable 与 Pracelable ---- - -#### 目录 - -1. 思维导图 -2. \ No newline at end of file diff --git a/blogs/Android/Serializable 与 Parcelable.md b/blogs/Android/Serializable 与 Parcelable.md new file mode 100644 index 0000000..b0ecd38 --- /dev/null +++ b/blogs/Android/Serializable 与 Parcelable.md @@ -0,0 +1,85 @@ +--- +Serializable 与 Parcelable +--- + +#### 目录 + +1. 概述 +2. 具体使用 +3. 区别对比 +4. 参考 + +#### 概述 + +Serializable 和 Parcelable 是用来序列化和反序列化的,其中 Serializable 是 Java 提供的一个序列化接口,它是一个空接口,专门为对象提供标准的序列化和反序列化操作,使用起来比较简单。而 Parcelable 则稍显复杂,实现该接口重写两个模版方法,并且需要提供一个 Creator。 + +#### 具体使用 + +##### Serializable + +```java +public class User implements Serializable { + + private static final long serialVersionUID = -541329592684050557L; + + public String name; + public int age; + +} +``` + +##### Parcalable + +```java +public class User implements Parcelable { + + public static final Creator CREATOR = new Creator() { + @Override + public User createFromParcel(Parcel source) { + return new User(source); + } + + @Override + public User[] newArray(int size) { + return new User[size]; + } + }; + public String name; + public int age; + + public User(String name, int age) { + this.name = name; + this.age = age; + } + + protected User(Parcel in) { + this.name = in.readString(); + this.age = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.name); + dest.writeInt(this.age); + } +} +``` + +#### 区别对比 + +##### 实现差异 + +Serializable 的实现,只需要实现一个 Serializable 接口即可,这只是给对象打了一个标记,系统会自动将其序列化;而 Parcelable 的实现,不仅需要实现 Parcelable 接口并重写模版方法,还要提供一个 CREATOR,并实现 Parcelable.Creator 接口,并实现读写的抽象方法。 + +##### 效率对比 + +Serializable 使用 I/O 读写存储在硬盘上,序列化过程中产生大量的临时变量,会引起频繁 GC,效率低下。而 Parcelable 是直接在内存中读写,更加高效。 + +#### 参考 + +[序列化与反序列化之 Parcelable 和 Serializable 浅析](https://juejin.im/entry/57e8d42e816dfa005ef310be) \ No newline at end of file diff --git a/blogs/Android/事件分发机制.md b/blogs/Android/事件分发机制.md new file mode 100644 index 0000000..8894ff3 --- /dev/null +++ b/blogs/Android/事件分发机制.md @@ -0,0 +1,62 @@ +--- +事件分发机制 +--- + +#### 目录 + +1. 概述 +2. 核心方法 +3. 关于 ACTION_MOVE 和 ACTION_UP +4. 参考 + +#### 概述 + +事件分发中的事件即指 MotionEvent,传递方向是 Activity -> ViewGroup -> View,然后在回溯。事件分发包含三个核心方法:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。 + +#### 核心方法 + +##### dispatchTouchEvent + +用于事件分发,返回结果表示是否消耗了当前事件。它和 onInterceptTouchEvent 和 onTouchEvent 的关系可以表示为: + +```java +public boolean dispatchTouchEvent(MotionEvent ev){ + boolean consume = false; + if(onInterceptTouchEvent(ev)){ + consume = onTouchEvent(ev); + }else{ + consume = child.dispatchTouchEvent(ev); + } + return consume; +} +``` + +##### onInterceptTouchEvent + +只存在于 ViewGroup 中,只有 ViewGroup 才会决定是否需要拦截事件自己处理。默认是不会拦截的,交给子 View 处理。 + +##### onTouchEvent + +用于事件处理,我们平时设置的 onTouchEventListener 和 onClickListener 都是在其内。 + +##### 总结 + +1. 对于 dispatchTouchEvent 和 onTouchEvent ,return true 代表终止时间传递,return false 则是回溯到父 View 的 onTouchEvent 方法。 +2. ViewGroup 想把事件分发给自己的 onTouchEvent,需要 onInterceptTouchEvent return true 把事件拦截下来,默认是不拦截的,所以 return super.onInterceptTouchEvent == return false 到 View.dispatchTouchEvent。 +3. View 没有拦截器,为了让 View 可以把事件分发给自己的 onTouchEvent,View 的 dispatchTouchEvent 默认实现(super)就是把事件分发给自己的 onTouchEvent。 + +#### 关于 ACTION_MOVE 和 ACTION_UP + +上面都是针对 ACTION_DOWN 的时间传递,ACTION_MOVE 和 ACTION_UP 在传递的过程中并不是和 ACTION_DOWN 一样。如果在执行 ACTION_DOWN 的时候返回了 false,后面一系列其他的 action 就不会再得到执行了。简单来说,就是当 dispatchTouchEvent 在进行事件分发的时候,只有前一个事件(如 ACTION_DOWN)返回 true,才会收到 ACTION_MOVE 和 ACTION_UP 的事件。 + +ACTION_DOWN 一旦在 onTouchEvent 被消费,那么之后的 ACTION_MOVE 和 ACTION_UP 就都会由其处理,结束时间传递。 + +比如我们在 Activity 的 onTouchEvent 返回 true: + +![](https://i.loli.net/2019/02/11/5c60d51909117.png) + +红线代表 ACTION_DOWN 事件流向,蓝线代表 ACTION_MOVE 和 ACTION_UP 事件流向。 + +#### 参考 + +[图解 Android 事件分发机制](https://www.jianshu.com/p/e99b5e8bd67b) \ No newline at end of file diff --git a/images/Android/事件分发.png b/images/Android/事件分发.png new file mode 100644 index 0000000..e606b4d Binary files /dev/null and b/images/Android/事件分发.png differ