-
-
Notifications
You must be signed in to change notification settings - Fork 114
实现原理
-
AnyLayer(提供常用效果的调用入口)
-
ViewManager(管理View的动态添加移除和KeyEvent事件注册)
-
Layer(对ViewManager的包装,实现进出场动画逻辑和事件监听,规范接口形式,分离出ViewHolder/ListenerHolder/Config三大内部类)
-
FrameLayer(限定父布局为FrameLayout,引入了Layer层级概念)
-
DecorLayer(限定父布局为DecorView)
-
DialogLayer(规范子布局层级,加入背景层,分离动画为背景动画和内容动画)
- PopupLayer(可依据锚点View定位)
- ToastLayer(吐司)
- GuideLayer(引导层)
- OverlayLayer(悬浮按钮)
- NotificationLayer(通知)
-
DialogLayer(规范子布局层级,加入背景层,分离动画为背景动画和内容动画)
-
DecorLayer(限定父布局为DecorView)
-
FrameLayer(限定父布局为FrameLayout,引入了Layer层级概念)
-
AnimatorHelper(创建常用属性动画)
一个工厂类,提供了静态方法创建Layer对象。
控制View的添加和移除逻辑,注册按键监听。
上面类间关系简单描述了一下
对ViewManager的包装,实现进出场动画逻辑和事件监听,规范接口形式,分离出ViewHolder/ListenerHolder/Config三大内部类
可以看出这个类是所有效果的基类,有以下几个特定:
-
对ViewManager的包装
可以自由指定父布局和子布局,可以通过继承在onGetParent和onCreateChild中返回,也可以通过parent()和child()方法设置。
其次是几个生命周期回调方法
- onAttach(View刚被添加到父布局)
- onPreShow(View开始绘制前,这里开始执行进场动画)
- onPostShow(View显示,进场动画结束)
- onPreRemove(View准备移除时,这里开始执行出场动画)
- onPostRemove(View准备移除时,这里开始执行出场动画)
- onDetach(View已被移除,出场动画结束)
-
实现进出场动画逻辑
在onPreDraw和onPreRemove中实现了进出场动画的流程。可通过继承在onCreateInAnimator和onCreateOutAnimator中返回,也可以通过animator()方法设置。
其中AnimatorCreator为创建自定义进出场动画的接口
-
事件监听
有几个常用的事件监听,在ListenerHolder中统一管理
- DataBindCallback(绑定数据)
- OnClickListener(点击事件监听)
- OnShowListener(显示动画开始和结束监听)
- OnDismissListener(消失时动画开始和结束监听)
- OnVisibleChangeListener(显示隐藏状态改变的监听)
-
分离出ViewHolder/ListenerHolder/Config三大内部类
这个看名字应该就知道了,就不介绍了。
继承自Layer,强制父布局为FrameLayout。主要就是引入了Layer层级概念。
继承自FrameLayer,强制父布局为DecorView。
而这个层级就是由两个静态内部类实现的
-
继承自FrameLayout,是各个层级浮层的容器,直接添加进DecorView。
-
继承自FrameLayout,定义了Level概念,是每个浮层的父布局,也就是在外面包了一层,用来控制浮层上下层级的容器。这个是直接添加进LayerLayout的。
好了就这么多了。更多了细节还是看源码吧。
Dialog效果的浮层。用上面的描述就是:
规范子布局层级,加入背景层,分离动画为背景动画和内容动画
一个一个来看。
-
规范子布局层级,加入背景层
从DecorLayer的介绍中可以知道LevelLayout是该类浮层的直接父布局。但它并不是DialogLayer中contentView的直接父布局。就是因为又加了一个ViewGroup把contextView和background包裹起来。布局文件是这样子的。
<?xml version="1.0" encoding="utf-8"?> <FrameLayout android:id="@+id/fl_container" > <ImageView android:id="@+id/iv_background" /> <FrameLayout android:id="@+id/fl_content_wrapper" /> </FrameLayout>
contentView其实是直接添加至fl_content_wrapper中的。
-
分离动画为背景动画和内容动画
因为有了contextView和background的概念,原来的动画就不好用了。所以从写了动画的创建逻辑,分离了背景和前景应用不同的动画。
继承自DialogLayer,加入了锚点定位。
吐司
引导层
悬浮按钮
通知