SlidingDrawer在开始时半开

时间:2011-06-07 01:09:25

标签: java android layout animation slidingdrawer

我正在处理我的应用程序,我想知道是否可以将滑动抽屉部分打开而不是完全关闭,这样用户可以在单击显示更多按钮之前在文本内容达到峰值,这样就能够显示文本的其余部分。

提前致谢。

4 个答案:

答案 0 :(得分:8)

我遇到了类似的问题,最后我修改了SlidingDrawer,以便在Drawer折叠/关闭时能够显示部分内容。使用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高)条带将以折叠/关闭模式显示(向右)。在扩展/打开模式下,此实现将像标准SlidingDrawer一样工作,但在折叠/关闭模式下,内容屏幕永远不会被完全隐藏(除非您指定semiClosedContentSize =“0dp”,这将把它变成标准的SlidingDrawer)。此实现基于Android-4(“1.6”)中SlidingDrawer的实现,但兼容(包括)Android-14(“4.0”)。此实现也应该与Android的未来版本兼容(在API 4和API 14之间的SlidingDrawer几乎没有任何变化)。此实现支持垂直和水平方向。

尝试一下!

此致 雅各布

答案 1 :(得分:1)

我遇到了和你一样的问题。一开始我只需要在我的滑动抽屉中有一个(相当窄的)列表视图,这样用户就可以在内容中找到一个高峰。只有当列表中的项目被选中且该项目的某些内容显示在列表视图旁边的图像视图中时,抽屉才应完全打开。

因此我的抽屉布局就是这样:

<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中应用类似的动画。

最后一句话:我的滑动抽屉位于布局中,因为它包含在该布局中,因此可以在多个位置访问抽屉。通常,您不需要在抽屉周围布局。

答案 2 :(得分:0)

也许尝试像设置滑动抽屉的内在内容就像是

 <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之间的线性布局“更多”的可见性

**编辑:嗯重新阅读你的问题,我实际上有点困惑:标题是“开始时打开”,但是你说“部分打开”。你想让它在部分开放的状态下开始吗?或当用户拖动它时部分打开?我的建议(未经测试)是将滑动抽屉的大小包装到内容中,并让内容最初从小开始显示按钮+任何你想在“更多”内部线性布局之外显示,然后显示它们点击按钮。

答案 3 :(得分:0)

我最近开发了应用程序,其中我有您要求的要求。 通过谷歌搜索我发现我们已经修改了原始滑动抽屉的源代码 并且整个修改后的代码与我一起测试并且工作正常。 我可以发送给你整个文件。只要给我你的电子邮件ID。
您还需要在项目的values文件夹中使用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>

我希望这会对你有所帮助。