English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Implémentation magique de listView pour afficher automatiquement le layout Android

借助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 swipe down
     else if(mFirstY-mCurrentY>mTouchSlop)
      direction=1; //listView swipe up
     if(direction==1)
     {
      if(mShow)
      {
       toolbarAnim(1); //Hide the view above
       mShow=!mShow;
      }
     }
     else if(direction==0)
     {
      if(!mShow)
      {
       toolbarAnim(0); //Display 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();
}

//The above is the animation of position and opacity attributes 

When using, the theme must be NoActionBar to avoid conflicts. At the same time, introduce compilation

dependencies{
   compile fileTree(include:['*.jar'],dir:'libs')
   compile 'com.android.support:appcompat-v7:21.0.3'
 } 

2. Lorsque les composants à cacher et à afficher ne sont pas toolbar, mais notre layout personnalisé myView, il faut prendre en compte certains points,
(1) Le layout doit utiliser le layout relatif, afin que notre layout personnalisé flotte au-dessus de listView.
(2Éviter que le premier item ne soit masqué par myView, ajouter un HeaderView à listView. À ce moment-là, il faut mesurer la hauteur de myView, il faut utiliser la méthode suivante pour poster la tâche sur le thread UI, sinon l'exécution échouera. 

final View header=new View(this); //Ajouter un headView à listView pour éviter que le premier item ne soit masqué header.post(new Runnable() {
 public void run() {
     header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
   }
  });

Les autres sont les mêmes que toolbar

C'est tout pour cet article, j'espère que cela aidera à votre apprentissage et que vous soutiendrez davantage le tutoriel à cri

Déclaration : Le contenu de cet article est issu du réseau, propriété de l'auteur original, le contenu est apporté par les utilisateurs d'Internet et téléchargé spontanément. Ce site Web ne détient pas de droits de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique. Si vous trouvez du contenu susceptible de violer les droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (au moment de l'envoi d'un e-mail, veuillez remplacer # par @ pour signaler une fraude, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)

Vous pourriez aussi aimer