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 scroll down else if(mFirstY-mCurrentY>mTouchSlop) direction=1; //listView scroll up if(direction==1) { if(mShow) { toolbarAnim(1); //ocultar o view superior mShow=!mShow; } } else if(direction==0) { if(!mShow) { toolbarAnim(0); //exibir o view superior mShow=!mShow; } } case MotionEvent.ACTION_UP: break; } return false; } }); }
animação de propriedade
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(); } //acima estão as animações de deslocamento e transparencia
ao usar, o theme deve ser NoActionBar, senão pode causar conflito. Além disso, adicione a compilação
dependencies{ compile fileTree(include:['*.jar', dir: 'libs' compile 'com.android.support:appcompat-v7:21.0.3' }
2Quando o componente a ser ocultado e exibido não é toolbar, mas o layout personalizado myView, é necessário prestar atenção a alguns pontos,
(1) O layout deve usar o layout relativo, permitindo que o layout personalizado flutue acima do listView.
(2Evite que o primeiro Item seja obscurecido pelo myView, adicione um HeaderView ao listView. Neste momento, é necessário medir a altura do myView, usando o método a seguir, postar a tarefa para a thread UI, caso contrário, a execução falhará.
final View header=new View(this); //Adicionar um headView ao listView para evitar que o primeiro item seja obscurecido header.post(new Runnable() { public void run() { header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight())); } });
Os outros são como toolbar
O que foi mencionado acima é o método de implementação do Android ListView que exibe e oculta automaticamente o layout apresentado pelo editor. Espero que isso ajude a todos. Se você tiver alguma dúvida, por favor, deixe um comentário, o editor responderá a tempo. Agradecemos também o apoio ao site Tutorial Yell.
Declaração: O conteúdo deste artigo é extraído da internet, pertence ao respectivo detentor dos direitos autorais, o conteúdo é contribuído e carregado voluntariamente pelos usuários da internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Se as informações forem confirmadas, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)