Можно ли программно отобразить макет ящика с анимацией?

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

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

Слушатель 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.

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

Вам нужно вызвать 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, если пользователь быстро переместится.