如何寫一個折疊布局
相信大部分人都會首先想到CoordinatorLayout
沒錯寒矿,使用CoordinatorLayout爽撒,然后再使用AppBarLayout很容易就能實(shí)現(xiàn)優(yōu)雅的折疊布局
但是如果產(chǎn)品要你在右下角加一個按鈕點(diǎn)擊回到頂部呢示启,并且滑動到一定距離才會顯示,默認(rèn)不顯示以躯。
我最先想到的是ScrollView移必,但是很遺憾會滑動沖突,然后我嘗試了重寫onTouchEvent和onInterceptTouchEvent但是都不是很好遭殉。
最后放棄ScrollView石挂,退而求其次實(shí)現(xiàn)了一個沒有滾動效果的回到頂部(個人感覺很不優(yōu)雅)
顯示與隱藏
顯示與隱藏這個很簡單可以寫一個View也可以使用一張圖片,主要看你的需求
那么距離如何判斷呢险污?
使用AppBarLayout的addOnOffsetChangedListener
方法
直接上代碼
mBinding.appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset >=0 ){
mBinding.toTop.setVisibility(View.GONE);
}else {
mBinding.toTop.setVisibility(View.GONE);
if (verticalOffset < -1250){
mBinding.toTop.setVisibility(View.VISIBLE);
}
}
}
});
判斷verticalOffset的值就行了
最頂部的值是0痹愚,越往下滑值越小
回到頂部
滑動距離我們已經(jīng)得出,那么只需要實(shí)現(xiàn)點(diǎn)擊后的回到頂部就行了
使用AppBarLayout的behavior
屬性蛔糯,詳細(xì)只是建議另找大佬的文章學(xué)習(xí)拯腮,我就不多寫了,免得暴露自己水平
直接看代碼
ViewGroup.LayoutParams layoutParams = mBinding.appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) ((CoordinatorLayout.LayoutParams) layoutParams).getBehavior();
if (behavior != null) {
behavior.setTopAndBottomOffset(0);
mBinding.toTop.setVisibility(View.GONE);
}
最主要的就是這句behavior.setTopAndBottomOffset(0);
因?yàn)槲沂侵苯踊氐巾敳恳响灾苯邮褂昧?
如果你想回到某個組件的位置动壤,在這句前面加上獲取組件位置的代碼:
float y = mBinding.tvTop.getY();//獲取組件的位置
behavior.setTopAndBottomOffset((int) -y);
然后就大功告成了
點(diǎn)擊后會直接跳到頂部,沒有過度過程
如果大佬有更好的方法歡迎評論指導(dǎo)下(非常感謝)