Как реализовать 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>


но падает и говорит об ошибке типа цвета при этом. Чего мне не хватает?

635   5  

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 -Toolbar combo для достижения эффекта ящика в стиле материала, где он виден под полупрозрачным строка состояния), то 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.Common style), вам не нужно переопределять 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

    Ничего не найдено.