English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
借助View的OnTouchListener接口来监听listView的滑动,通过比较与上次坐标的大小,判断滑动方向,并通过滑动方向来判断是否需显示或者隐藏对应的布局,并且带有动画效果。
1.自动显示隐藏Toolbar
首先给listView增加一个HeaderView,避免第一个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为系统ActionBar的高度
定义一个mTouchSlop变量,获取系统认为的最低滑动距离
mTouchSlop=ViewConfiguration.get(this).getScaledTouchSlop(); //系统认为的最低滑动距离
判断滑动事件
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 scrolls down else if(mFirstY - mCurrentY > mTouchSlop) direction = 1; // ListView scrolls up if(direction == 1) { if(mShow) { toolbarAnim(1); // Hide the view above mShow = !mShow; } } else if(direction == 0) { if(!mShow) { toolbarAnim(0); // Show the view above mShow = !mShow; } } case MotionEvent.ACTION_UP: break; } return false; } }); }
Property animation
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(); } //Above is the translation and transparency attribute animation
When using, the theme must be NoActionBar to avoid conflicts. At the same time, compile
dependencies{ compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:21.0.3' }
2. Quando il componente da nascondere e visualizzare non è toolbar, ma il nostro layout personalizzato myView, ci sono alcuni punti da notare
(1) Il layout deve utilizzare il layout relativo, in modo che il nostro layout personalizzato sospenda sopra il listView.
(2) Per evitare che il primo Item venga oscurato da myView, aggiungi un HeaderView al listView. In questo caso, è necessario misurare l'altezza di myView, utilizzare il seguente metodo per postare il task sulla UI thread, altrimenti l'esecuzione potrebbe fallire.
final View header=new View(this); //Aggiungi un headView al listView per evitare che il primo item venga oscurato header.post(new Runnable() { public void run() { header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight())); } });
Altri sono come toolbar
Il metodo di implementazione dell'auto-visualizzazione e dell'auto-nascondimento del layout di Android ListView descritto sopra è stato presentato dall'autore agli utenti. Spero che sia utile per tutti. Se avete qualsiasi domanda, lasciate un commento e l'autore risponderà tempestivamente. In questo senso, ringrazio anche tutti i sostenitori del sito Web Yell Education!
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è della proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato elaborato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.