Я создал ящик приложения, используя следующую библиотеку: http://developer.android.com/training/implementing-navigation/nav-drawer.html
Я хочу показать навигационный ящик анимацией при открытии приложения. Как я могу это сделать?
Я создал ящик приложения, используя следующую библиотеку: 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, если пользователь быстро переместится.