SlidingDrawer полуоткрытый на старте - PullRequest
3 голосов
/ 07 июня 2011

Я работаю над частью своего приложения, и мне было интересно, можно ли частично открыть раздвижной ящик вместо того, чтобы быть полностью закрытым, чтобы пользователь мог просмотреть текстовое содержимое, прежде чем нажать кнопку «Показать больше», которая сможетпоказать остаток текста.

Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 02 апреля 2012

У меня была похожая проблема, и я закончил тем, что изменил SlidingDrawer, чтобы иметь возможность показывать часть содержимого, когда ящик свернут / закрыт. С SemiClosedSlidingDrawer вы указываете, сколько содержимого экрана должно отображаться в свернутом / закрытом режиме с атрибутом измерения 'semiClosedContentSize':

<se.smartrefill.view.SemiClosedSlidingDrawer 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res/se.smartrefill.app.x"
    android:id="@+id/mySlidingDrawer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    custom:orientation="horizontal"
    custom:handle="@+id/handle"
    custom:content="@+id/content"
    custom:allowSingleTap="true"
    custom:semiClosedContentSize="40dp"
    >

Тогда ваш attrs.xml (в res / values ​​/) также должен содержать:

<declare-styleable name="SemiClosedSlidingDrawer">
    <attr name="handle" format="integer"/>
    <attr name="content" format="integer"/>
    <attr name="orientation" format="string" />
    <attr name="bottomOffset" format="dimension"  />
    <attr name="topOffset" format="dimension"  />
    <attr name="allowSingleTap" format="boolean" />
    <attr name="animateOnClick" format="boolean" />
    <attr name="semiClosedContentSize" format="dimension" />
</declare-styleable>

, где 'se.smartrefill.app.x' относится к пакету приложения, определенному в AndroidManifest.

Этот конкретный SlidingDrawer (выше) настроен для использования горизонтальной ориентации, и полоса шириной 40dp (и fill_parent high) в представлении содержимого будет отображаться (справа) в свернутом / закрытом режиме. В расширенном / открытом режиме эта реализация будет работать так же, как стандартный SlidingDrawer, но в свернутом / закрытом режиме экран содержимого никогда не станет полностью скрытым (если вы не укажете semiClosedContentSize = "0dp", который превратит его в стандартный SlidingDrawer). Эта реализация основана на реализации SlidingDrawer в Android-4 («1.6»), но совместима до (включая) Android-14 («4.0»). Эта реализация должна быть совместима и с будущими версиями Android (почти ничего не изменилось в SlidingDrawer между API 4 и API 14). Эта реализация поддерживает как вертикальную, так и горизонтальную ориентацию.

Попробуйте!

С уважением, Jacob

1 голос
/ 23 апреля 2012

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

Поэтому макет моего ящика выглядит следующим образом:

<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.

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

0 голосов
/ 11 ноября 2011

Я недавно разработал приложение, в котором у меня было требование как то, что требуется от вас.Посмотрев в Google, я обнаружил, что мы изменили исходный код оригинального Sliding Drawer. Я сделал это, и весь измененный код был со мной, который я протестировал, и он работает нормально. Я могу отправить вам весь файл. Просто дайте мне ваш Email-идентификатор.
вам также потребуется файл attrs.xml в папке значений вашего проекта, где вы хотите использовать этот код.Код attrs.xml размещен ниже.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="SlidingDrawer">
        <attr name="handle" format="integer"/>
        <attr name="content" format="integer"/>
    </declare-styleable>
</resources>

Надеюсь, это поможет вам.

0 голосов
/ 07 июня 2011

Возможно, попробуйте что-то вроде установки внутреннего содержимого объекта slidedrawer, например,

 <SlidingDrawer android:layout_height="wrap_content"
             android:handle="@+id/handle" 
             android:content="@+id/content"
             android:id="@+id/slide" 
             android:orientation="vertical"
             android:layout_width="fill_parent">
    <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"...>
       <Button android:id="@+id/ShowMore"... />
       <LinearLayout android:id="@+id/More" android:visibility="gone" ...>
           ... more stuff
       </LinearLayout>

    </LinearLayout>
</SlidingDrawer>

, затем установите кнопку ShowMore, чтобы переключать видимость линейного макета "Дополнительно" между View.GONE и View.VISIBLE

** РЕДАКТИРОВАТЬ: Хм, перечитывая ваш вопрос, я на самом деле немного запутался: заголовок «... открыт при старте», но затем вы говорите «частично открыть».Вы хотели, чтобы это началось в частично открытом состоянии?или открыть частично, когда пользователь перетаскивает его?Мое предложение (непроверенное) состоит в том, чтобы выдвижной ящик обернул его по размеру для содержимого, и чтобы содержимое изначально начиналось с малого, показывая только кнопку + все, что вы хотите показать за пределами внутреннего линейного макета «Больше», а затем показывайте, что когда онинажмите кнопку.

...