Подтвердить что ты не робот

Могу ли я автоматически открыть схему ящика с анимацией?

Я создал ящик приложения, используя следующую библиотеку: http://developer.android.com/training/implementing-navigation/nav-drawer.html

Я хочу показать навигационный ящик анимацией при открытии приложения. Как я могу это сделать?

4b9b3361

Ответ 1

прослушиватель Predraw, а также безопасность

Вот пример прослушивателя. Это буквально запустит анимацию, как только это возможно, что может быть слишком быстро. Возможно, вы захотите сделать комбинацию этого с показанной секундой. Я не буду показывать две комбинированные, только отдельные.

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // Building NavDrawer logic here. Just a method call would be best.
    ...

    ViewTreeObserver vto = drawer.getViewTreeObserver();
    if (vto != null) vto.addOnPreDrawListener(new ShouldShowListener(drawer));
}

private static class ShouldShowListener implements OnPreDrawListener {

    private final DrawerLayout drawerLayout;

    private ShouldShowListener(DrawerLayout drawerLayout) {
        this.drawerLayout= drawerLayout;
    }

    @Override
    public boolean onPreDraw() {
        if (view != null) {
            ViewTreeObserver vto = view.getViewTreeObserver();
            if (vto != null) {
                vto.removeOnPreDrawListener(this);
            }
        }

        drawerLayout.openDrawer(Gravity.LEFT);
        return true;
    }
}

PostDelay Runnable, известный как опасный

// Delay is in milliseconds
static final int DRAWER_DELAY = 200;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // Building NavDrawer logic here. Just a method call would be best.
    ...
    new Handler().postDelayed(openDrawerRunnable(), DRAWER_DELAY);
}

private Runnable openDrawerRunnable() {
    return new Runnable() {

        @Override
        public void run() {
            drawerLayout.openDrawer(Gravity.LEFT);
        }
    }
}

Внимание

Если они впервые начинают вращаться в начале приложения BOOM! Прочитайте это сообщение в блоге для получения дополнительной информации http://corner.squareup.com/2013/12/android-main-thread-2.html. Лучше всего было бы использовать приемник predraw или удалить ваш runnable в onPause.

Ответ 2

Вы можете вызвать openDrawer(int gravity) в DrawerLayout, чтобы открыть ящик с анимацией.

Ответ 3

Вам нужно позвонить drawerLayout.openDrawer(Gravity.LEFT), чтобы оживить открытие ящика. Ящик не будет анимировать, если вы сделаете вызов слишком рано в жизненном цикле активности.

Самое простое решение - просто установить флаг в onCreate() и действовать на него в onResume().

Вы хотите удостовериться, что вы только установили флаг, когда savedInstanceState имеет значение null, указывающее, что действие не возобновляется с фона. Вы не хотите, чтобы ящик выдвигался каждый раз, когда вы меняете ориентацию или переключаете приложения.

public class MainActivity extends ActionBarActivity {
    private DrawerLayout drawerLayout;
    private boolean firstResume = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawerLayout = (DrawerLayout)findViewById(R.id.drawer);

        if(savedInstanceState == null){
            firstResume = true;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if(firstResume) {
            drawerLayout.openDrawer(Gravity.LEFT);
        }

        firstResume = false;
    }
}

Вы также можете использовать OnPreDrawListener, но я чувствую, что это немного излишне сложно, так как onPreDraw вызывается несколько раз, поэтому вам нужно удалить слушателя после открытия ящика. Вы также считаете, что preDraw - подходящее время для активации ящика, который является внутренней реализацией макета ящика. Будущая реализация может не анимироваться должным образом до тех пор, пока, например, onDraw.

Отсрочка открытия ящика на произвольное количество миллисекунд является опасным способом решения этой проблемы. В худшем случае вызов для открытия ящика может произойти после onDestroy, если пользователь быстро переместится.