没有句柄的SlidingDrawer和对内容的滑动操作

时间:2012-07-24 10:35:11

标签: android android-widget

我想在我的应用程序中使用SlidingDrawer。但我必须隐藏handle,并且必须在SlidingDrawer关闭时显示 20%内容。 另外,我想将handle的所有滑动(触摸或拖动)操作分配给content。如果有人为此提供解决方案,请帮助我。

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

<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,但在SlidingDrawer关闭时无法知道如何显示 20%内容将操作设置为Content的{​​{1}}。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分: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 );
    }

答案 3 :(得分:0)

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

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

另外,我在res / values /

的attr.xml文件中添加了这个
<!-- 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>