English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Используя интерфейс 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 (при отправке письма, пожалуйста, замените # на @) для подачи жалобы и предоставления соответствующих доказательств. При подтверждении, этот сайт немедленно удалил涉嫌侵权的内容.