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

Магическая реализация listView для автоматического отображения и скрытия макета на Android

Используя интерфейс OnTouchListener класса View для мониторинга скольжения listView, сравнивая с предыдущими координатами, определяя направление скольжения, и определяя, нужно ли отображать или скрывать соответствующие макеты, с анимацией.

1. Автоматическое отображение и скрытие Toolbar

Сначала добавьтеHeaderView к listView, чтобы избежать того, чтобы первый элемент был закрываем 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向下滑动
     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();
}

//Сверху расположены анимации смещения и прозрачности 

При использовании темы NoActionBar, иначе может возникнуть конфликт. Также введите компиляцию

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

2. Когда компонент, который нужно скрывать и показывать, не является toolbar, а нашим пользовательским макетом myView, необходимо учитывать некоторые моменты:
(1) Логика должна использовать относительное расположение, чтобы наш пользовательский макет висел над listView.
(2) Чтобы избежать прикрытия первого элемента myView, добавитьHeaderView к listView, в этом случае необходимо измерить высоту myView, использовать следующий метод, чтобы задачу передать в UI-поток, иначе выполнение может быть ошибочным. 

final View header=new View(this); //добавить headView к listView, чтобы избежать прикрытия первого элемента header.post(new Runnable() {
 public void run() {
     header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
   }
  });

Другие, как и toolbar

Это конец статьи, я надеюсь, что она поможет вам в изучении, и希望大家多多支持呐喊教程。

Заявление: контент этой статьи был взят из Интернета, авторские права принадлежат соответствующему автору. Контент был предложен пользователями Интернета и загружен самостоятельно. Этот сайт не имеет права собственности на него, не был отредактирован вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма, пожалуйста, замените # на @) для подачи жалобы и предоставления соответствующих доказательств. При подтверждении, этот сайт немедленно удалил涉嫌侵权的内容.

Давай посмотрим!