7

我想SlidingDrawer在我的应用程序中使用。但是我必须隐藏handle并且必须显示20%的内容才能在SlidingDrawer关闭时可见。我还想将 to 的所有滑动(触摸或拖动)动作分配handlecontent。如果有人对此有一些解决方案,请帮助我。

请参考我尝试过的以下代码片段。

<View
    android:id="@id/handle"
    android:layout_width="0dip"
    android:layout_height="fill_parent" />

<LinearLayout
    android:id="@id/content"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/sliding_drawer" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/sliding_drawer" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/sliding_drawer" />
</LinearLayout>

这是我的活动:

     import android.app.Activity;
     import android.graphics.Color;
     import android.os.Bundle;
     import android.view.View;
     import android.widget.SlidingDrawer;
     import android.widget.SlidingDrawer.OnDrawerCloseListener;
     import android.widget.SlidingDrawer.OnDrawerOpenListener;

     public class SlidingDrawerActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final SlidingDrawer drawer = (SlidingDrawer) findViewById(R.id.drawer);
        drawer.setOnDrawerCloseListener(new OnDrawerCloseListener() {

            public void onDrawerClosed() {
                // TODO Auto-generated method stub
                drawer.setBackgroundColor(Color.BLACK);
            }
        });

        drawer.setOnDrawerOpenListener(new OnDrawerOpenListener() {

            public void onDrawerOpened() {
                // TODO Auto-generated method stub
                drawer.setBackgroundColor(Color.BLUE);
            }
        });

        View content = drawer.getContent();
        content.setClickable(true);
        content.setTouchDelegate(drawer.getHandle().getTouchDelegate());
    }
}

在这里,我可以handle通过设置隐藏width=0dip,但无法知道如何在关闭时显示20%的内容SlidingDrawer并将操作设置ContentSlidingDrawer.

我尝试获取touchDelegate手柄并将其设置为Content,但它不起作用。请帮我解决这个问题。

4

4 回答 4

1

要拥有一个没有句柄的slidingDrawer,技巧就是将句柄的宽度和高度设置为0dp。干杯

于 2015-04-09T08:31:01.303 回答
0

我会做一些像你一样的事情。

由于 Slidedrawer 现在已弃用,我使用了名为 MultiDirectionSlidingDrawer 的自定义 slidedraw。这是我在互联网上找到的代码:MultiDirectionSlidingDrawer Source Code

要将内容视图显示为句柄,我不会隐藏句柄而是隐藏内容。我将内容视图的高度设置为 0 dip

<it.sephiroth.demo.slider.widget.MultiDirectionSlidingDrawer
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/drawer"
    custom:handle="@+id/handle"
    custom:content="@+id/content"
    custom:direction="topToBottom"
    custom:animateOnClick="false"
    custom:allowSingleTap="false"

    >
    <LinearLayout 
        android:id="@id/handle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center"
        >
        <!--
        paste your content here
        -->
    </LinearLayout>
    <LinearLayout 
        android:id="@id/content"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        android:gravity="center"
        >

    </LinearLayout>
</it.sephiroth.demo.slider.widget.MultiDirectionSlidingDrawer>

当我的抽屉从顶部开始时,我在onMeasure中计算顶部偏移量

@Override
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec )
{
    int widthSpecMode = MeasureSpec.getMode( widthMeasureSpec );
    int widthSpecSize = MeasureSpec.getSize( widthMeasureSpec );

    int heightSpecMode = MeasureSpec.getMode( heightMeasureSpec );
    int heightSpecSize = MeasureSpec.getSize( heightMeasureSpec );

        if ( widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED ) { throw new RuntimeException(
            "SlidingDrawer cannot have UNSPECIFIED dimensions" ); }

        final View handle = mHandle;
        measureChild( handle, widthMeasureSpec, heightMeasureSpec );

        //Custom top offset
        int intHandleHeight = handle.getHeight();
        mTopOffset = intHandleHeight*80*-1/100;

        if ( mVertical ) {
            int height = heightSpecSize - handle.getMeasuredHeight() - mTopOffset;
            mContent.measure( MeasureSpec.makeMeasureSpec( widthSpecSize, MeasureSpec.EXACTLY ), MeasureSpec.makeMeasureSpec( height, MeasureSpec.EXACTLY ) );
        } else {
            int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset;
            mContent.measure( MeasureSpec.makeMeasureSpec( width, MeasureSpec.EXACTLY ), MeasureSpec.makeMeasureSpec( heightSpecSize, MeasureSpec.EXACTLY ) );
        }

        setMeasuredDimension( widthSpecSize, heightSpecSize );
    }
于 2013-06-05T05:14:40.247 回答
0

我正在尝试做一些非常相似的事情。你有运气吗?

为了在 SlidingDrawer 关闭时显示 20% 的内容,我建议使用 SemiClosedSlidingDrawer。我相信这是我最初发现它的地方:http: //pastebin.com/FtVyrcEb

另外,我在我的 attr.xml 文件中添加了这个 res/values/

<!-- SemiClosedSlidingDrawer -->
<declare-styleable name="SemiClosedSlidingDrawer">
    <attr name="handle" format="integer" />
    <attr name="content" format="integer" />
    <attr name="topOffset" format="dimension" />
    <attr name="bottomOffset" format="dimension" />
    <attr name="allowSingleTap" format="boolean" />
    <attr name="animateOnClick" format="boolean" />
    <attr name="semiClosedOrientation" format="string" />
    <attr name="semiClosedContentSize" format="dimension" />
</declare-styleable>
于 2013-07-18T16:03:52.690 回答
0

我认为当前的 SlidingDrawer 不可能做到这一点,除非您正在处理可以切割并分成 20% 的东西。如果您查看 SlidingDrawer 的源代码,特别是open()您会看到它调用了一个私有方法,openDrawer(). 这就是这样做的:

private void openDrawer() {
    moveHandle(EXPANDED_FULL_OPEN);
    mContent.setVisibility(View.VISIBLE);

    if (mExpanded) {
        return;
    }

    mExpanded = true;

    if (mOnDrawerOpenListener != null) {
        mOnDrawerOpenListener.onDrawerOpened();
    }
}

如您所见,在手柄开始移动之前,内容(“抽屉”)是不可见的。抽屉移动时似乎没有挂钩,只有当它开始或结束时,所以您将无法动态更新手柄或抽屉中的内容。

如果你在处理一张图片,你可以把它分成两部分,20% 和 80%。但由于您使用的是 3 个 TextView,因此看起来这不是一个选项。

鉴于我认为一个选择是获取 SlidingDrawer 的来源并创建自己的类。这样您就可以完全控制绘图的处理方式,但仍然可以重用所有侦听器。这是源链接: https ://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/SlidingDrawer.java

于 2012-09-06T02:47:27.930 回答