由前一篇文章:
SeniorUI01_UI绘制流程分析(源码级分析)
我们知道,每一个Activity都有一个Window,Window仅有一个唯一实现类PhoneWindow,包含一个DecorView,所有的布局都是添加到DecorView上的,DecorView继承FrameLayout,因此在有些时候可以利用这点,实现特定效果。
1 RequireMent
(1)底部弹出操作框
(2)屏幕非操作框区域事件仍响应
(3)显示动画:整体逐渐向上,顶部有曲线波动效果
2 效果图
3 Theory
(1) 获取Window对应的DecorView,addView形式添加弹框View
(2)封装弹框View实现弹出效果,弹出效果分 外部动画(上升+曲线抖动)和 内部动画(列表内容上升)
(3)内部动画实现:
自定义控件+ ValueAnimator(修改参数,通知重新绘制) + Path(贝塞尔曲线Path.quadTo)
(4)外部动画:RecyclerView 的layoutAnimation 实现
4 CoreCode
(1)获取DecorView,同时为了保证addView后不遮挡虚拟键,获取导航栏高度,设置bottomMargin
获取DecorView:
getWindow().getDecorView()
获取导航栏高度:
添加View
if(rootView.getParent()!=null){
mParentVG.removeView(rootView);
}
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
lp.bottomMargin = getNavigationHeight(mParentVG.getContext());
mParentVG.addView(rootView,lp);
bouncingView.show();
(2)自定义View实现外部动画效果,同时保留一个监听器,当动画执行到一定时间时通知RecyclerView执行动画
(3)RecyclerView实现内部动画
item_duang_show.xml (透明、平移)
rv_layout_animation.xml( 定义为layoutAnimation 延迟0.1)
收到自定义View的通知,设置数据,执行动画
5 Demo
SeniorUI01_DrawingProcessActivity