Любые проблемы или запросы на включение не будут решены. Пожалуйста, рассмотрите возможность создания собственной версии, если потребуются изменения.
Морфинг меню Android, кнопки «Назад», «Закрыть» и «Проверить».
Полный контроль над анимацией:
compile ' com.balysv.materialmenu:material-menu:2.0.0 '
См. README для настройки более старых версий библиотеки.
Используйте его как отдельный элемент на Toolbar
:
private MaterialMenuDrawable materialMenu ;
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . toolbar );
Toolbar toolbar = ( Toolbar ) findViewById ( R . id . toolbar );
setSupportActionBar ( toolbar );
toolbar . setNavigationOnClickListener ( new View . OnClickListener () {
@ Override public void onClick ( View v ) {
// Handle your drawable state here
materialMenu . animateState ( newState );
}
});
materialMenu = new MaterialMenuDrawable ( this , Color . WHITE , Stroke . THIN );
toolbar . setNavigationIcon ( materialMenu );
}
Простое старое View
, которое рисует значок и предоставляет API для управления его состоянием. Вы можете встроить его в любой макет, включая Toolbar
.
Настройка также доступна через атрибуты xml:
app:mm_color="color" // Color of drawable
app:mm_visible="boolean" // Visible
app:mm_transformDuration="integer" // Transformation animation duration
app:mm_scale="integer" // Scale factor of drawable
app:mm_strokeWidth="integer" // Stroke width of icons (can only be 1, 2 or 3)
app:mm_rtlEnabled="boolean" // Enabled RTL layout support (flips all drawables)
app:mm_iconState="enum" // Set the intial state of the drawable (burger, arrow, x or check)
Существует четыре состояния значка:
BURGER , ARROW , X , CHECK
Чтобы изменить состояние рисования
MaterialMenu . animateIconState ( IconState state )
Чтобы изменить состояние рисования без анимации
MaterialMenu . setIconState ( IconState state )
Чтобы анимировать рисование вручную (например, на слайде навигационного ящика):
MaterialMenu . setTransformationOffset ( AnimationState state , float value )
Чтобы скрыть или показать рисуемый объект:
MaterialMenu . setVisible ( boolean visible )
где AnimationState
— одно из BURGER_ARROW, BURGER_X, ARROW_X, ARROW_CHECK, BURGER_CHECK, X_CHECK
, а value
находится в диапазоне от 0
до 2
Примечание. Состояние значка определяется текущим значением смещения. Убедитесь, что вы используете offset
от 0
до 1
для прямой анимации и 1
до 2
для обратной, чтобы правильно сохранять состояние значка при воспроизведении активности.
Внедрите MaterialMenu
в свой ActionBar, как описано выше, и добавьте собственный DrawerListener
:
private DrawerLayout drawerLayout ;
private boolean isDrawerOpened ;
private MaterialMenuDrawable materialMenu ;
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
toolbar = ( Toolbar ) findViewById ( R . id . toolbar );
setSupportActionBar ( toolbar );
materialMenu = new MaterialMenuDrawable ( this , Color . WHITE , Stroke . THIN );
toolbar . setNavigationIcon ( materialMenu );
drawerLayout = ( DrawerLayout ) findViewById ( R . id . drawer_layout );
drawerLayout . setDrawerListener ( new DrawerLayout . SimpleDrawerListener () {
@ Override
public void onDrawerSlide ( View drawerView , float slideOffset ) {
materialMenu . setTransformationOffset (
MaterialMenuDrawable . AnimationState . BURGER_ARROW ,
isDrawerOpened ? 2 - slideOffset : slideOffset
);
}
@ Override
public void onDrawerOpened ( View drawerView ) {
isDrawerOpened = true ;
}
@ Override
public void onDrawerClosed ( View drawerView ) {
isDrawerOpened = false ;
}
@ Override
public void onDrawerStateChanged ( int newState ) {
if ( newState == DrawerLayout . STATE_IDLE ) {
if ( isDrawerOpened ) {
menu . setIconState ( MaterialMenuDrawable . IconState . ARROW );
} else {
menu . setIconState ( MaterialMenuDrawable . IconState . BURGER );
}
}
}
});
}
Балис Валентукявичюс
Copyright 2016 Balys Valentukevicius
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.