Я придумал решение... Не знаю, идеально ли оно, но работает хорошо.
Итак, что я сделал, это один FrameLayout с обоими макетами, сложенными вместе, а затем я просто анимировал верхний макет, чтобы он скользил вправо от экрана (просто нужно вызвать slideTo или scrollBy. И в основном это так! Довольно просто и эффективно !(хотя код не очень красивый :P)
РЕДАКТИРОВАТЬ:
Несколько примеров кода.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF" >
<include
android:id="@+id/menu_layout"
layout="@layout/menu_list"
android:visibility="invisible"/>
<include
android:id="@+id/news_list_parent"
layout="@layout/main_news_list"
/>
</FrameLayout>
Это макет xml, довольно простой. Включенный .xml представляет собой простые LinearLayouts с заголовком и списком.
«Магия» происходит в анимации:
protected void applyTransformation(float interpolatedTime, Transformation t) {
int newOffset;
if(expanded) {
newOffset = 0;
newOffset = (int)(endOffset*(1-interpolatedTime));
} else {
newOffset = (int)(endOffset*(interpolatedTime));
}
view.scrollTo(-newOffset, 0);
}
endOffset — это целевое движение. Я устанавливаю его перед запуском анимации, и представление, которое я хочу анимировать (в данном случае это представление с id=news_list_parent), устанавливается в конструкторе.
Но просто чтобы понять, как это работает, создайте кнопку, и ее слушатель сделает что-то вроде этого:
if(viewBeneath.getVisibility() == View.INVISIBLE) {
viewBeneath.setVisibility(View.Visible);
viewToSlide.slideTo(-(width-50), 0);
}
И, наконец, переопределите кнопку «Назад», чтобы сделать действие, противоположное кнопке.
if(viewBeneath.getVisibility() == View.VISIBLE) {
viewToSlide.slideTo(0, 0);
viewBeneath.setVisibility(View.Visible);
}
Прочитайте это как псевдокод =) Это то, что я сделал в начале, этот код потерян :P
person
baen
schedule
11.12.2011