使用到监听回调,根据scrollY/(screen_height/3f)设置alpha,在ScrollView中设置属性:
android:clipToPadding="false"//该控件的绘制范围是否在padding里面(false:绘制的时候范围会考虑padding,即往里面缩进)
android:clipChildren="false"//子控件是否能超出padding的区域(ScrollView向上滑动时,child可以滑出该区域)
1.xml结构
<RelativeLayout>
<ScrollView>
....
</ScrollView>
<Toolbar/>
</RelativeLayout>
2.在自定义MyScrollView中获取ScrollView滑动的距离,通过距离/屏幕高度的百分比计算出随着滑动的alpha值,并设置监听回调,MyScrollView中的关键代码如下:
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
//1.获取ScrollView的Y方向的滑动距离
int scrollY = getScrollY();
//2.获取屏幕高度
int heightPixels = getContext().getResources().getDisplayMetrics().heightPixels;
//3.设置滚动范围,当scrollY < 屏幕高度的1/3时,进行设置
float v = heightPixels / 3f;
//4.设置滚动的百分比
float v1 = scrollY / v;//(0-1)
//5.透明度应为1-0
float alpha = 1 - v1;
//7.在必要的时候调用接口中的方法
if(listener!=null){
if(scrollY <= v){
listener.onTranlucent(alpha);
}
}
}
//6.监听回调
private TranslucentListener listener;
public void setListener(TranslucentListener listener) {
this.listener = listener;
}
public interface TranslucentListener{
/**
* 透明度的回调监听
* @param alpha 0~1 透明度
*/
public void onTranlucent(float alpha);
}
3.在界面中给toolbar设置透明度
public class ScrollToolBarActivity extends AppCompatActivity implements MyScrollView.TranslucentListener {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroll_tool_bar);
//给myScrollView设置监听
MyScrollView myScrollView = findViewById(R.id.scv);
myScrollView.setListener(this);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
public void onTranlucent(float alpha) {
//设置toolbar的透明度 这个方法在ScrollView移动时调用
toolbar.setAlpha(alpha);
}
}
4.在xml文件中给MyScrollView设置属性:
android:clipToPadding="false"//该控件的绘制范围是否在padding里面(false:绘制的时候范围会考虑padding,即往里面缩进)
android:clipChildren="false"//子控件是否能超出padding的区域(ScrollView向上滑动时,child可以滑出该区域)
避免ScrollView滑动时,Toolbar的部分出现白色区域。