前几天看到dove上有一个标题栏会随着listview滑动而缩小的动画,感觉很有意思,就尝试着做做看。
一开始希望能使用Toolbar,研究了半天,感觉里面封装的东西太多了,添加view很麻烦,想做类似豌豆荚或者dove的标题移动动画很麻烦。
最后就妥协用了LinearLayout来做标题栏。
做这种东西肯定就是onTouchListener + 移动布局了,就想到了以前做地图时候用到的代码。
看了一下,用的是getLayoutParams的height属性 (mTitleBar.getLayoutParams().height = mActionBarHeight )。
这个属性你可以直接给他赋值,然后加上一句mTitleBar.requestLayout();就可以改变布局了。
不过用这个做动画的时候,标题栏会一直抖动,非常愚蠢,我也不知道为什么,想想以前做的地图好像也是这样的。
应该是这种方法需要的资源比较多,估计是要一直重新生成这个view所以会变成这样。
然后就去看看前天用过的侧滑listview控件的源码。
这个控件的滑动是用view 的layout方法,这个方法我知道,就是移动view的位置,不用重新生成view,应该可以解决抖动的问题。
layout(int l, int t, int r, int b)
这样的方法,左、上、右、下,这个顺序有点奇怪。
if(mTitleBar.getBottom() + dip > mActionBarHeight){
mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mTitleBar.getBottom()+dip);
mFrameContain.layout(mFrameContain.getLeft(),mFrameContain.getTop() + dip,mFrameContain.getRight(),mFrameContain.getBottom());
大概是这么用的。
里面的CONTIAN是一个默认值,用来进行点击的过滤,当移动距离太小的时候我们就把他通过touchshake这个属性过滤掉
mFriendListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float nY = event.getY() - downY;
touchshake = Math.abs(nY) < CONTIAN;
if(touchshake){
click = true;
}else{
click = false;
if(nY < 0 ){
//向上
mListener.scrollUp((int)nY);
}
else {
mListener.scrollDown((int)nY);
}
}
}
return false;//当返回true的时候会把listview的滚动监听截断,返回false的话不会
}
});
@Override
public void scrollUp(int dip) {
if(mTitleBar.getBottom() + dip > mActionBarHeight){
mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mTitleBar.getBottom()+dip);
mFrameContain.layout(mFrameContain.getLeft(),mFrameContain.getTop() + dip,mFrameContain.getRight(),mFrameContain.getBottom());
}else{
mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mActionBarHeight);
mFrameContain.layout(mFrameContain.getLeft(), mActionBarHeight, mFrameContain.getRight(), mFrameContain.getBottom());
}
}
@Override
public void scrollDown(int dip) {
if(mTitleBar.getBottom() + dip<= mActionBarHeight * 2){
mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mTitleBar.getBottom()+dip);
mFrameContain.layout(mFrameContain.getLeft(),mFrameContain.getTop() + dip,mFrameContain.getRight(),mFrameContain.getBottom());
}else{
mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mActionBarHeight * 2);
mFrameContain.layout(mFrameContain.getLeft(), mActionBarHeight * 2, mFrameContain.getRight(), mFrameContain.getBottom());
}
}
突然发现这样之后就可以愉快的使用Toolbar了!!