Я столкнулся с такой же проблемой, как и вы.В начале мне нужно только (довольно узкое) представление списка в моем выдвижном ящике, чтобы пользователь мог просто получить представление о содержании.Ящик должен полностью открываться только тогда, когда элемент в списке выбран, и некоторое содержимое для этого элемента отображается в виде изображения рядом с представлением списка.
Поэтому макет моего ящика выглядит следующим образом:
<RelativeLayout
android:id="@+id/drawerContainer"
android:layout_alignParentRight="true"
android:layout_width="120dp"
android:layout_height="match_parent">
<SlidingDrawer
android:id="@+id/drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
android:handle="@+id/handle"
android:content="@+id/content">
<ImageView
android:id="@+id/handle"
android:layout_width="20dip"
android:layout_height="match_parent"
android:src="@drawable/drawer_handle />
<LinearLayout
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">
<ListView
android:id="@+id/list"
android:layout_width="100dp"
android:layout_height="match_parent">
</ListView>
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
</ImageView>
</LinearLayout>
</SlidingDrawer>
</RelativeLayout>
Итак, при запуске изображение исчезло.В OnItemClickListener для моего списка просмотра я управляю параметрами компоновки ящика:
private OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (imageView.getVisibility() == View.GONE) {
ExpandViewAnimation animation = new ExpandViewAnimation(drawerContainer, ((View) drawerContainer.getParent()).getWidth());
animation.setDuration(500);
drawerContainer.setAnimation(animation);
animation.start();
imageView.setVisibility(View.VISIBLE);
}
//code for displaying an image in the imageview
}
};
Как вы можете видеть, я использую свою собственную анимацию для контейнера ящика, так что удобство открывающегося выдвижного ящика составляетсохранились.Вот класс анимации:
public class ExpandViewAnimation extends Animation {
int targetWidth;
int initialWidth;
View view;
public ExpandViewAnimation(View view, int targetWidth) {
this.view = view;
this.targetWidth = targetWidth;
initialWidth = view.getWidth();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
int newWidth = initialWidth + (int) ((targetWidth - initialWidth) * interpolatedTime);
LayoutParams lp = new LayoutParams((LayoutParams) view.getLayoutParams());
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
view.setLayoutParams(lp);
view.getLayoutParams().width = newWidth;
view.requestLayout();
if (newWidth == targetWidth) {
LayoutParams matchParentParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
view.setLayoutParams(matchParentParams);
view.clearAnimation();
}
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
}
@Override
public boolean willChangeBounds() {
return true;
}
}
Причина, по которой я устанавливаю новые параметры макета, заключается в том, что при запуске я сохраняю исходный набор параметров (как в файле макета) и применяю его обратно в onDrawerClose.:
private OnDrawerCloseListener onDrawerCloseListener = new OnDrawerCloseListener() {
@Override
public void onDrawerClosed() {
imageView.setVisibility(View.GONE);
imageView.setImageDrawable(null);
drawerContainer.setLayoutParams(initialLayoutParams);
}
};
Если вы хотите, чтобы пользователь мог полностью открыть ящик с помощью движения пальцем по ручке, вы можете применить аналогичную анимацию в onTouchListener.
Последнее замечание:мой выдвижной ящик находится в макете, потому что он включен в этот макет с тем, чтобы ящик был доступен в нескольких местах.В общем, вам не нужна эта раскладка вокруг вашего ящика.