因为根据布局的滑动改变toolbar的透明度在各大app上都比较常见,而且最近公司项目也要这个效果,所以就去实现了一下,效果不错,所以就记录一下这个实现.
因为我用的布局是ScrollView,所以我想着在他的滑动监听里去实现,可突然发现它并没有现成的监听滑动的方法,但是有一个onScrollChanged方法,所以就自定义一个MyScrollView类,该类核心代码如下:
在他的onScrollChanged方法中实现代码如下:
public void setmOnScrollChangedListener(OnScrollChangedListener mOnScrollChangedListener) {
this.mOnScrollChangedListener = mOnScrollChangedListener;
}
if(mOnScrollChangedListener != null)
{
mOnScrollChangedListener.onScrollChanged(this,l,t,oldl,oldt);//自定义接口中的方法
}
public interface OnScrollChangedListener {
void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt);
}
在我的PurchaseDetailActivity中首先定义了两个全局变量,然后再如下方法中赋值
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
scrollView.scrollTo(0,0);
headerHeight = getResources().getDimension(R.dimen.y500);//顶部高度
minHeaderHeight = getResources().getDimension(R.dimen.abc_action_bar_default_height_material);//顶部最低高度,即Bar的高度
toolbar.getBackground().mutate().setAlpha(0);
}
在最核心的onScrollChanged方法中完成最后的监听
@Override
public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
//Y轴偏移量
float scrollY = who.getScrollY();
//Log.e("===onScrollChanged===","======="+scrollY);
//变化率
float headerBarOffsetY = headerHeight - minHeaderHeight;//Toolbar与header高度的差值
//Toolbar背景色透明度
if (scrollY==0)
{
toolbar.getBackground().mutate().setAlpha(0);
}
else if (scrollY>0)
{
float offset = 1 - Math.max((headerBarOffsetY - scrollY) / headerBarOffsetY, 0f);
toolbar.getBackground().mutate().setAlpha((int) (offset * 255));
}
else
{
toolbar.getBackground().mutate().setAlpha(0);
}
}
罗辑不难,而且也挺好实现的.一开始是用材料设计,可结果发现和预期的效果不对,用过的人会知道用三大布局结合使用是达到了收缩的效果.