我想在我的应用程序中使用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
,但它不起作用。
请帮我解决这个问题。
答案 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>