Как реализовать DrawerArrowToggle из библиотеки Android appcompat v7 21
так что теперь, когда Android 5.0 был выпущен мне было интересно, как реализовать анимированные иконки actionbar.
библиотека здесь реализует его отлично для меня, но так как библиотека appcompat v7 имеет его, как он может быть реализован?
библиотека ссылается на него в темах.xml
<item name="drawerArrowStyle">@style/Widget.AppCompat.DrawerArrowToggle</item>
под этот стиль
<style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">
обновление
Я получил это реализовано с помощью V7 DrawerToggle. Однако я не могу его стиль. Пожалуйста Помогите
Я нашел стиль для него в V7 styles_base.xml
<style name="Base.Widget.AppCompat.DrawerArrowToggle" parent="">
<item name="color">?android:attr/textColorSecondary</item>
<item name="thickness">2dp</item>
<item name="barSize">18dp</item>
<item name="gapBetweenBars">3dp</item>
<item name="topBottomBarArrowSize">11.31dp</item>
<item name="middleBarArrowSize">16dp</item>
<item name="drawableSize">24dp</item>
<item name="spinBars">true</item>
</style>
Я добавил Это к моим стилям и не работал. Также добавил в свою привлекательность.xml
<declare-styleable name="DrawerArrowToggle">
<!-- The drawing color for the bars -->
<attr name="color" format="color"/>
<!-- Whether bars should rotate or not during transition -->
<attr name="spinBars" format="boolean"/>
<!-- The total size of the drawable -->
<attr name="drawableSize" format="dimension"/>
<!-- The max gap between the bars when they are parallel to each other -->
<attr name="gapBetweenBars" format="dimension"/>
<!-- The size of the top and bottom bars when they merge to the middle bar to form an arrow -->
<attr name="topBottomBarArrowSize" format="dimension"/>
<!-- The size of the middle bar when top and bottom bars merge into middle bar to form an arrow -->
<attr name="middleBarArrowSize" format="dimension"/>
<!-- The size of the bars when they are parallel to each other -->
<attr name="barSize" format="dimension"/>
<!-- The thickness (stroke size) for the bar paint -->
<attr name="thickness" format="dimension"/>
</declare-styleable>
но падает и говорит об ошибке типа цвета при этом. Чего мне не хватает?
5 ответов:
во-первых, вы должны знать
android.support.v4.app.ActionBarDrawerToggleустарела.вы должны заменить это на
android.support.v7.app.ActionBarDrawerToggle.вот мой пример и я использую новый
ToolbarзаменитьActionBar.MainActivity.java
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); mDrawerToggle.syncState(); }стили.xml
<style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@android:color/white</item> </style>вы можете прочитать документы на AndroidDocument#DrawerArrowToggle_spinBars
этот атрибут является ключом к реализации анимация меню со стрелками.
public static int DrawerArrowToggle_spinBars
должны ли бары вращаться или нет во время перехода
должно быть логическое значение, либо "true" или "false".Итак, вы установили это:
<item name="spinBars">true</item>.тогда анимация может быть представлена.
надеюсь, это может помочь вам.
Если вы используете библиотеку поддержки, предоставленную DrawerLayout как полагают в создание навигации ящик обучение, вы можете использовать добавленный android.поддержка. v7.приложение.ActionBarDrawerToggle (Примечание: отличается от уже устаревшего android.поддержка. v4.приложение.ActionBarDrawerToggle):
показывает значок гамбургера, когда ящик закрыт и стрелка, когда ящик открыт. Оно анимация между этими двумя состояниями при открытии ящика.
хотя обучение не было обновлено с учетом класса deprecation / new, вы должны иметь возможность использовать его почти точно такой же код - единственное отличие в его реализации-это конструктор.
Я создал небольшое приложение, которое было схожим функционалом
MainActivity
public class MyActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer); android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar); ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.open, R.string.close ) { public void onDrawerClosed(View view) { super.onDrawerClosed(view); invalidateOptionsMenu(); syncState(); } public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); invalidateOptionsMenu(); syncState(); } }; drawerLayout.setDrawerListener(actionBarDrawerToggle); //Set the custom toolbar if (toolbar != null){ setSupportActionBar(toolbar); } getSupportActionBar().setDisplayHomeAsUpEnabled(true); actionBarDrawerToggle.syncState(); } }мой XML этой деятельности
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyActivity" android:id="@+id/drawer" > <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" > <include layout="@layout/toolbar_custom"/> </FrameLayout> <!-- The navigation drawer --> <ListView android:layout_marginTop="?attr/actionBarSize" android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#457C50"/> </android.support.v4.widget.DrawerLayout>моя пользовательская панель инструментов XML
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/toolbar" android:background="?attr/colorPrimaryDark"> <TextView android:text="U titel" android:textAppearance="@android:style/TextAppearance.Theme" android:textColor="@android:color/white" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </android.support.v7.widget.Toolbar>Мой Стиль Темы
<resources> <style name="AppTheme" parent="Base.Theme.AppCompat"/> <style name="AppTheme.Base" parent="Theme.AppCompat"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primaryDarker</item> <item name="android:windowNoTitle">true</item> <item name="windowActionBar">false</item> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@android:color/white</item> </style> <color name="primary">#457C50</color> <color name="primaryDarker">#580C0C</color> </resources>мои стили в значениях-v21
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="AppTheme" parent="AppTheme.Base"> <item name="android:windowContentTransitions">true</item> <item name="android:windowAllowEnterTransitionOverlap">true</item> <item name="android:windowAllowReturnTransitionOverlap">true</item> <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> <item name="android:windowSharedElementExitTransition">@android:transition/move</item> </style> </resources>
чтобы ответить на обновленную часть вашего вопроса: чтобы стиль значок ящика / стрелка, у вас есть два варианта:
стиль самой стрелки
чтобы сделать это, переопределите
drawerArrowStyleв вашей теме Вот так:<style name="AppBaseTheme" parent="Theme.AppCompat.Light"> <item name="drawerArrowStyle">@style/MyTheme.DrawerArrowToggle</item> </style> <style name="MyTheme.DrawerArrowToggle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="color">@android:color/holo_purple</item> <!-- ^ this will make the icon purple --> </style>это, наверное, не то, что вы хотите, потому что сама панель действий должна иметь согласованный стиль со стрелкой, поэтому, скорее всего, вы хотите вариант два:
темы Верхней Панели/Панели Инструментов
переопределить
android:actionBarTheme(actionBarThemeдля appcompat) атрибут глобальной темы приложения с вашей собственной темой (которую вы, вероятно, должны получить отThemeOverlay.Material.ActionBar/ThemeOverlay.AppCompat.ActionBar) вот так:<style name="AppBaseTheme" parent="Theme.AppCompat.Light"> <item name="actionBarTheme">@style/MyTheme.ActionBar</item> </style> <style name="MyTheme.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar"> <item name="android:textColorPrimary">@android:color/white</item> <!-- ^ this will make text and arrow white --> <!-- you can also override drawerArrowStyle here --> </style>важное замечание здесь заключается в том, что при использовании пользовательского макета с
Toolbarвместо реализации stock ActionBar (например, если вы используетеDrawerLayout-NavigationView-Toolbarcombo для достижения эффекта ящика в стиле материала, где он виден под полупрозрачным строка состояния), тоactionBarThemeатрибут, очевидно, не подобран автоматически (потому что он должен заботиться оAppCompatActivityпо умолчаниюActionBar), так что для вашего обычаяToolbarНе забудьте применить свою тему вручную:<!--inside your custom layout with DrawerLayout and NavigationView or whatever --> <android.support.v7.widget.Toolbar ... app:theme="?actionBarTheme">-- это позволит решить либо AppCompat по умолчанию
ThemeOverlay.AppCompat.ActionBarили переопределение, если вы установили атрибут в производной теме.PS небольшой комментарий по поводу
drawerArrowStyleпереопределить и -- который многие источники предлагают установить вtrueчтобы получить анимацию ящика / стрелки. Дело в том,spinBarsэтоtrueпо умолчанию в AppCompat (проверьтеBase.Widget.AppCompat.DrawerArrowToggle.Commonstyle), вам не нужно переопределятьactionBarThemeвообще, чтобы получить анимацию работает. Вы получаете анимацию, даже если вы переопределяете ее и устанавливаете атрибут вfalse, это просто другая, менее закрученная анимация. Главное здесь заключается в том, чтобы использоватьActionBarDrawerToggle, это то, что тянет в необычные анимированные рисуется.
Я хочу немного исправить приведенный выше код
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }и все остальное останется прежним...
для тех, кто испытывает проблемы
Drawerlayoutналожение панели инструментовдобавить
android:layout_marginTop="?attr/actionBarSize"корневой макет содержимого ящика
Comments