上滑ScrollView,实现标题滑动到顶部时一直悬浮在顶部
不论怎么滑动屏幕内容,当标题部分到达顶部时,便会一直会显示在顶部。
实现原理:
1. 顶部1,顶部2布局需要完全一样,初始化时顶部1不显示,为gone。
2. 当顶部2向上滑动到屏幕顶端时,设置顶部1可见,由于顶部1不包含在ScrollVIew里面,所以会一直存在,不会被滑动;
而向下滑时,当顶部2到达屏幕顶端,隐藏顶部1,显示顶部2即可。
所以实现关键步骤是:
判断顶部2是否滑动到了顶部,也就是标题栏之下。
先看布局,很简单:
布局和原理里面一致:顶部1,ScrollView 就没了。
只是有一个自定义的ScrollView,这个是重点,在代码里面讲,布局也没什么。
记得顶部1不在ScrollView里面,二顶部2在ScrollView里面哦~
接下来就看自定义的ScrollView:
这里面关键的就是onScrollChanged这个方法,实现了ScrollView滑动距离的监听。
public classMyScrollViewextendsScrollView{
private staticStopCallstopCall;//ScrollView向上滑动到顶部的距离private intupH;publicMyScrollView(Contextcontext) {
super(context);}
publicMyScrollView(Contextcontext,AttributeSetattrs) {
super(context,attrs);//赋值:200很重要,这个值是顶部2上面的高度upH= dpTopx(200);//单位是dp}
publicMyScrollView(Contextcontext,AttributeSetattrs,intdefStyleAttr) {
super(context,attrs,defStyleAttr);}
public static voidsetCallback(StopCallc) {
stopCall= c;}
/***关键部分在这里,测量当前ScrollView滑动的距离*
*其中t就是,单位是px,不是dp*
* stopCall是一个接口,是为了在Activity中实现设置顶部1/2可不可见*/@Overrideprotected voidonScrollChanged(intl,intt,intoldl,intoldt) {
super.onScrollChanged(l,t,oldl,oldt);if(t > upH) {//如果向上滑动距离>本例中图片高度stopCall.stopSlide(true);//设置顶部1可见,顶部2不可见} else{//否则stopCall.stopSlide(false);//设置顶部1不可见,顶部2可见}
}
/*** F:将dp转成为px*/private intdpTopx(intdpValue) {
final floatscale= this.getResources().getDisplayMetrics().density;return(int) (dpValue * scale+ 0.5f);}
public interfaceStopCall{
voidstopSlide(booleanisStop);}
}
在activity中
public classMainActivity extendsAppCompatActivity implementsMyScrollView.StopCall{@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myscroview.setCallback(this);//设置myscrollview滑动的监听}
@Overridepublic voidstopSlide(booleanisStop) {
//根据滑动距离显示或隐藏顶部1,顶部2if(isStop) {
rl2.setVisibility(View.INVISIBLE);rl1.setVisibility(View.VISIBLE);} else{
rl1.setVisibility(View.INVISIBLE);rl2.setVisibility(View.VISIBLE);}
}
}