备注:NotBoringActionBar效果:github地址
1. 效果的实现原理:
在布局中header和listview帧布局排列,header有一个默认高度,给listview设置一个与header等高空布局的headerview。
listview滑动的时候,计算listview的滑动距离,利用view'的setTranslationY特性将headerview移动等距离同时利用这个距离、demo中的imagview、还有系统actionbar中的
actionbarimageview计算demo中imageview的setTranslationY、setscaleX等值进行动画处理。
效果巧妙的利用了listview的headerview空布局和系统actionbar的特性做动画效果。
2. setTranslationY和setTranslationX解析:
setTranslationY: 设置view相当于上边界(top属性)的属相平移距离。
setTranslationX:设置view相当于左边界(left属性)的横向平移距离。
此二种移动都是基于android系统坐标系的(以左上角为00)。
3. setScaleX:设置viewX轴上的缩放
setScaleY: 设置viewY轴上的缩放
此二种缩放或造成view的移动,所以通常2和3一起使用,不会在view的缩放的过程中造成view的偏移。
4. listview的高度计算:
1. 对于此demo:利用header的高度和listview的显示item进行计算:
显示item为0时:listview第一个view的top既是listview的滑动距离,即listview.getchildernat(0).gettop()。
显示item不为0时:listview.getchildernat(0).gettop() + header.getheight() + firstvisibleitem * listview.getchildernat(0).getheight();
2. 除去header。getheight()既是普通listview的滑动距离的计算方法。
5. 效果中对于动画速率的运用很巧妙,特别是listview的滑动距离与header的高度的比值和动画速率和scale中的0和1保持一致,这个设计很巧妙。
6. scale的计算:计算是用demo的header中imagview和actionbar中actionbarimagview的宽度、高度、top、left、right、bottom计算。
7、 demo中的计算都是估算的,并不是精确计算。
在此基础上,修改了一个动画效果:在listview滑动的过程中,textview直接滑动到actionbar中展示(不适用actionbar中的默认titleview)下载链接。