如题,直接上效果图,就是这么粗暴
原理
这个吸顶效果的原理很简单,就是一个视觉效果
如图,其实页面上有两个相同布局的标题,吸顶标题默认隐藏,然后监听ScrollView滚动的高度Y,当滚动的高度Y大于内容1的高度,吸顶标题显示,反之,隐藏吸顶标题。这样从视觉效果上看,标题具有吸顶效果。是不是很easy
代码
public class MainActivity extends AppCompatActivity
{
private ScrollView scrollView;
private TextView tv_content;//内容1
private TextView tv_title_top;//吸顶标题
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scrollView = (ScrollView) findViewById(R.id.scrollView);
tv_content = (TextView) findViewById(R.id.tv_content);
tv_title_top = (TextView) findViewById(R.id.tv_title_top);
//scrollview滚动监听
scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener()
{
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
{
//scrolly:scrollview滚动的高度
//tv_content.getHeight()内容1的高度
if (scrollY > tv_content.getHeight())
{
tv_title_top.setVisibility(View.VISIBLE);
} else
{
tv_title_top.setVisibility(View.GONE);
}
}
});
}
}
这里有个问题,scrollview的setOnScrollChangeListener滚动监听,要求6.0(API23)之后才能用。
解决方法:在6.0以下有onScrollChanged方法,也能监听scrollview滑动,但是这个方法不能直接调用,所以要自定义一个继承scrollview的view,提供一个方法,把onScrollChanged暴露出来。
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
public class MyScrollView extends ScrollView
{
private ScrollViewListener scrollViewListener = null;
public interface ScrollViewListener
{
void onScrollChanged(MyScrollView scrollView, int l, int t, int oldl, int oldt);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener)
{
this.scrollViewListener = scrollViewListener;
}
public MyScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
//此方法受保护的
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
super.onScrollChanged(l, t, oldl, oldt);
if (scrollViewListener != null)
{
scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
}
}
}
然后用MyScrollview替换掉原来的scrollview,调用滚动监听方法
scrollView.setScrollViewListener(new MyScrollView.ScrollViewListener()
{
@Override
public void onScrollChanged(MyScrollView scrollView, int l, int t, int oldl, int oldt)
{
//t:scrollview滚动的高度
//tv_content.getHeight()内容1的高度
if (t > tv_content.getHeight())
{
tv_title_top.setVisibility(View.VISIBLE);
} else
{
tv_title_top.setVisibility(View.GONE);
}
}
});