神奇的listView實(shí)現(xiàn)自動顯示隱藏布局Android代碼
借助View的OnTouchListener接口來監(jiān)聽listView的滑動,通過比較與上次坐標(biāo)的大小,判斷滑動方向,并通過滑動方向來判斷是否需顯示或者隱藏對應(yīng)的布局,并且?guī)в袆赢嬓Ч?br />
1.自動顯示隱藏Toolbar
首先給listView增加一個(gè)HeaderView,避免第一個(gè)Item被Toolbar遮擋。
View header=new View(this); header.setLayoutParams(new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, (int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material))); mListView.addHeaderView(header);
//R.dimen.abc_action_bar_default_height_material為系統(tǒng)ActionBar的高度
定義一個(gè)mTouchSlop變量,獲取系統(tǒng)認(rèn)為的最低滑動距離
判斷滑動事件
bbsListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
mFirstY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurrentY=event.getY();
if(mCurrentY-mFirstY>mTouchSlop)
direction=0; //listView向下滑動
else if(mFirstY-mCurrentY>mTouchSlop)
direction=1; //listView向上滑動
if(direction==1)
{
if(mShow)
{
toolbarAnim(1); //隱藏上方的view
mShow=!mShow;
}
}
else if(direction==0)
{
if(!mShow)
{
toolbarAnim(0); //展示上方的view
mShow=!mShow;
}
}
case MotionEvent.ACTION_UP:
break;
}
return false;
}
});
}
屬性動畫
protected void toolbarAnim(int flag)
{
if(set!=null && set.isRunning())
{
set.cancel();
}
if(flag==0)
{
mAnimator1=ObjectAnimator.ofFloat(mToolbar,
"translationY", linearView.getTranslationY(),0);
mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 0f,1f);
}
else if(flag==1)
{
mAnimator1=ObjectAnimator.ofFloat(mToolbar,
"translationY", linearView.getTranslationY(),-linearView.getHeight());
mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 1f,0f);
}
set=new AnimatorSet();
set.playTogether(mAnimator1,mAnimator2);
set.start();
}
//上面為位移還有透明度屬性動畫
使用的時(shí)候theme要用NoActionBar的,不然會引起沖突。同時(shí)引入編譯
dependencies{
compile fileTree(include:['*.jar'],dir:'libs')
compile 'com.android.support:appcompat-v7:21.0.3'
}
2.當(dāng)要隱藏和顯示的組件不是toolbar,而是我們自定義的布局myView時(shí),需要注意一些點(diǎn),
(1) 布局要用相對布局,讓我們自定義的布局懸浮在listView上方。
(2)避免第一個(gè)Item被myView遮擋,給listView增加一個(gè)HeaderView,此時(shí)需要測量myView的高度,要用下面這種方法,把任務(wù)post到UI線程中,不然執(zhí)行會出錯(cuò)。
final View header=new View(this); //給listView增加一個(gè)headView,避免第一個(gè)item被遮擋 header.post(new Runnable() {
public void run() {
header.setLayoutParams(new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
}
});
其他的與toolbar一樣
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android 通過向viewpage中添加listview來完成滑動效果(類似于qq滑動界面)
- android Listview模擬聊天界面
- Android 新聞界面模擬ListView和ViewPager的應(yīng)用
- Android ListView自定義Adapter實(shí)現(xiàn)仿QQ界面
- Android App界面的ListView布局實(shí)戰(zhàn)演練
- Android中使用Expandablelistview實(shí)現(xiàn)微信通訊錄界面
- android動態(tài)布局之動態(tài)加入TextView和ListView的方法
- Android ListView添加頭布局和腳布局實(shí)例詳解
- Android實(shí)現(xiàn)的ListView分組布局改進(jìn)示例
- Android開發(fā)之ListView的簡單用法及定制ListView界面操作示例
相關(guān)文章
Flutter實(shí)現(xiàn)手勢識別功能詳解方法
在Flutter中使用GestureDetector可以來完成對手勢的識別,包括長按、滑動、雙擊等手勢,這篇文章主要介紹了Flutter實(shí)現(xiàn)手勢識別功能2022-11-11
Android無限循環(huán)RecyclerView的完美實(shí)現(xiàn)方案
這篇文章主要介紹了Android無限循環(huán)RecyclerView的完美實(shí)現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Android基于繪制緩沖實(shí)現(xiàn)煙花效果
這篇文章主要介紹了Android基于繪制緩沖實(shí)現(xiàn)煙花效果,文中通過代碼示例和圖文結(jié)合介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以自己動手嘗試一下2024-03-03
android異步加載圖片并緩存到本地實(shí)現(xiàn)方法
圖片過多造成內(nèi)存溢出,這個(gè)是最不容易解決的,要想一些好的緩存策略,比如大圖片使用LRU緩存策略或懶加載緩存策略。今天首先介紹一下本地緩存圖片2013-01-01

