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 deslizar para baixo else if(mFirstY-mCurrentY>mTouchSlop) direction=1; //listView deslizar para cima 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 atributo
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 transparência
ao usar, o theme deve ser NoActionBar, caso contrário, haverá 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 nosso layout personalizado myView, é necessário prestar atenção a alguns pontos,
(1) O layout deve usar o layout relativo, permitindo que o nosso 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())); } });
Outros são como toolbar
Isso é tudo o que há no artigo. Esperamos que isso ajude na sua aprendizagem e que você apoie o tutorial Grito com mais frequência.
Declaração: O conteúdo deste artigo é extraído da Internet, pertencente ao respectivo proprietário. O conteúdo é contribuído e carregado voluntariamente pelos usuários da Internet. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por eventuais responsabilidades legais. 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. Caso seja confirmada, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)