先说下标题的意思,因为当时问了一些人,就是这么问的,说不知道啥意思,没理解我想干什么,这个意思就是。。。抽屉难道一定要完全关着或完全开着吗?我只开一部分然后声称我这个抽屉是关着的不行么。
算了,先贴个效果图:
这个情况是抽屉关着的时候:
这个情况是抽屉开着的时候
这是股票的一个抽屉。 然后boss给我说还有3个,顿时纠结,幸亏把内容最为丰富的股票给先搞定了。
。。。。就是这样,一开始就想着把抽屉的手柄写大点,用一个LinearLayout布局来做手柄,但是这样一来,发现布局里面的所有的按钮都相应了我的点击事件,擦。在抽屉手把位置的左边,有个按钮,点击一下会变成减号,但是如果是这样的话,那么我只要一点手柄,他也跟着变了。寻找了一些方法,未果,终于在csdn的一个问题帖子上找到了类似的情况。
基本的思路就是,先拦截了所有抽屉手柄的触摸事件,然后在找出用户想作为手柄的控件id,以及他们的屏幕位置。当点击到那些位置的时候,再做判断。
直接上代码,比较少代码就能实现的,理解起来也不困难,当然,要熟悉Android的控件所对应的实现方法会更简单:
Java代码
public class MySlidingDrawer extends SlidingDrawer {
private int mHandleId = 0; // 抽屉行为控件ID
private int[] mTouchableIds = null; // Handle 部分其他控件ID
public int getHandleId() {
return mHandleId;
}
public void setHandleId(int mHandleId) {
this.mHandleId = mHandleId;
}
public int[] getTouchableIds() {
return mTouchableIds;
}
public void setTouchableIds(int[] mTouchableIds) {
this.mTouchableIds = mTouchableIds;
}
public MySlidingDrawer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MySlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/*
* 获取控件的屏幕区域
*/
public Rect getRectOnScreen(View view) {
Rect rect = new Rect();
int[] location = new int[2];
View parent = view;
if (view.getParent() instanceof View) {
parent = (View) view.getParent();
}
parent.getLocationOnScreen(location);
view.getHitRect(rect);
rect.offset(location[0], location[1]);
return rect;
}
// 拦截触摸事件,用以修改事件
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// 确定控件的屏幕区域
int[] location = new int[2];
int x = (int) event.getX();
int y = (int) event.getY();
this.getLocationOnScreen(location);
x += location[0];
y += location[1];
// handle部分独立按钮,循环寻找非抽屉手柄的布局。
if (mTouchableIds != null) {
for (int id : mTouchableIds) {
View view = findViewById(id);
Rect rect = getRectOnScreen(view);
if (rect.contains(x, y)) {
Log.i("MySlidingDrawer on touch", String.format(
"Action=%d Button=%s", event.getAction(),
((LinearLayout) view).getContext().toString()));
// return
boolean result = view.dispatchTouchEvent(event);
Log.i("MySlidingDrawer dispatchTouchEvent", "" + result);
return false;
}
}
}
// 抽屉行为控件,本想同上,写成数组,寻找多个手柄,但是这样就没有了抽屉拖动效果
if (event.getAction() == MotionEvent.ACTION_DOWN && mHandleId != 0) {
View view = findViewById(mHandleId);
Log.i("MySlidingDrawer on touch", String.format("%d,%d", x, y));
Rect rect = getRectOnScreen(view);
Log.i("MySlidingDrawer handle screen rect", String
.format("%d,%d %d,%d", rect.left, rect.top, rect.right,
rect.bottom));
if (rect.contains(x, y)) {// 点击抽屉控件时交由系统处理
Log.i("MySlidingDrawer", "Hit handle");
} else {
return false;
}
}
return super.onInterceptTouchEvent(event);
}
// 获取触屏事件
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
大概就是这样的重写。
再来是布局文件:
<?xml version="1.0" encoding="UTF-8"?>
Xml代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<Button android:id="@+id/buttontest" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:text="test" />
<!-- bottom menu -->
<!-- 股票类 -->
<com.quan.MySlidingDrawer android:id="@+id/stockDrawer"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:handle="@+id/handleStock"
android:content="@+id/contentStock" android:visibility="visible">
<!-- top view 3 rows -->
<LinearLayout android:layout_width="fill_parent"
android:id="@+id/handleStock" android:layout_height="85dip"
android:orientation="vertical">
<LinearLayout android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_gravity="center">
<ImageButton android:layout_width="60dip" android:id="@+id/mbutton"
android:layout_height="10dip" android:src="@drawable/up"
android:layout_gravity="center" />
</LinearLayout>
<!-- top left -->
<LinearLayout android:layout_height="75dip"
android:layout_width="fill_parent" android:orientation="horizontal"
android:id="@+id/otherHandler" android:background="#000">
<!-- top left -->
<RelativeLayout android:id="@+id/topLeft"
android:layout_width="39dip" android:layout_height="75dip"
android:orientation="vertical">
<Button android:layout_width="30dip" android:layout_height="30dip"
android:id="@+id/btn_add_cut" android:layout_alignParentTop="true"
android:layout_alignParentLeft="true" android:layout_gravity="center_vertical"
android:focusable="true" android:background="@drawable/add" />
</RelativeLayout>
<RelativeLayout android:layout_width="120dip"
android:layout_height="75dip">
<TextView android:layout_height="50dip" android:text="2616.99"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" android:gravity="right"
android:id="@+id/tvCurrentPrice" android:textColor="#f00"
android:textSize="30dip" android:layout_gravity="center_vertical" />
<TextView android:text="+22.50" android:textColor="#f00"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" android:id="@+id/tvUpDown" />
<TextView android:layout_height="wrap_content"
android:text="0.21%" android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" android:gravity="right"
android:textColor="#f00" android:id="@+id/tvAmplitude" />
</RelativeLayout>
<View android:layout_width="1dip" android:layout_height="fill_parent"
android:background="#ff0000" />
<!-- top right -->
<TableLayout android:id="@+id/topRight"
android:layout_width="159dip" android:layout_height="fill_parent"
android:orientation="vertical">
<TableRow>
<TextView android:text="委比" android:textColor="#848684"
android:layout_height="24dip" android:layout_width="70dip"
android:gravity="left" />
<TextView android:id="@+id/tvAppoint" android:text="2.3%"
android:textColor="#f00" android:layout_height="24dip"
android:layout_width="89dip" android:gravity="right"
android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:layout_width="fill_parent"
android:background="#f00" />
<TableRow>
<TextView android:text="委差" android:textColor="#848684"
android:layout_height="24dip" android:layout_width="70dip"
android:gravity="left" />
<TextView android:id="@+id/tvPoorCom" android:text="32"
android:textColor="#f00" android:layout_height="24dip"
android:layout_width="89dip" android:gravity="right"
android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:layout_width="fill_parent"
android:background="#f00" />
<TableRow>
<TextView android:text="量比" android:textColor="#848684"
android:layout_height="24dip" android:layout_width="70dip"
android:gravity="left" />
<TextView android:id="@+id/tvReQuantity" android:text="-2.45"
android:textColor="#0f0" android:layout_height="24dip"
android:layout_width="89dip" android:gravity="right"
android:paddingRight="2dip" />
</TableRow>
</TableLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout android:id="@+id/contentStock"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:background="#000">
<View android:layout_height="1dip" android:layout_width="fill_parent"
android:background="#f00" />
<!-- bottom rows -->
<LinearLayout android:id="@+id/bottomRows"
android:layout_height="253dip" android:layout_width="fill_parent"
android:orientation="horizontal">
<!-- left table -->
<TableLayout android:layout_height="fill_parent"
android:layout_width="160dip">
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="均价" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="总手" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="现手" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/CURVOL" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="金额" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/MONEY" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="外盘" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买一" android:gravity="left" />
<TextView android:text="2539.82" android:textColor="#f00"
android:layout_height="25dip" android:layout_width="80dip"
android:gravity="center" />
<TextView android:text="23" android:textColor="#AE8B00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买二" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买三" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买四" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买五" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
</TableLayout>
<!-- right table -->
<TableLayout android:layout_height="fill_parent"
android:layout_width="160dip">
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="昨收" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="开盘" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/OPEN" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="最高" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/MAX" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="最低" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/MIN" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="内盘" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/INNER_TRAY" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖一" android:gravity="left" />
<TextView android:text="2549.82" android:textColor="#f00"
android:layout_height="25dip" android:layout_width="80dip"
android:gravity="center" />
<TextView android:text="45" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖二" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖三" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖四" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖五" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#AE8B00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
</TableLayout>
</LinearLayout>
</LinearLayout>
</com.quan.MySlidingDrawer>
</RelativeLayout>
做完这些之后又把那三个布局写完,发现。。。你妹的,原来的布局是用一个相对布局来控制抽屉的拉伸长度。其他3个内容都没这么多,所以3个的下面都是空的,又搞笑呢。接着寻找抽屉适配内容进行长度控制。
又是重写,烦躁的很啊。直接代码,主要思想就是先测量里面内容的高度。因为抽屉本身是没有写wrap_content(即适配内容高度来进行拉伸高度控制)的,所以重写的应该是这个部分。在一个英文的编程疑难解答上找到了答案。
onMeasure是测量控件宽高的方法。setMeasuredDimension是设置到布局里~~~
Java代码
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 = getHandle();
final View content = getContent();
measureChild(handle, widthMeasureSpec, heightMeasureSpec);
int extra = handle.getHeight() / 6;
System.out.println(handle.getMeasuredHeight() + " "
+ content.getHeight());
if (mVertical) {
int height = heightSpecSize - handle.getMeasuredHeight()/* + extra */
- mTopOffset;
content.measure(widthMeasureSpec,
MeasureSpec.makeMeasureSpec(height, heightSpecMode));
heightSpecSize = handle.getMeasuredHeight() /* + extra */
+ mTopOffset + content.getMeasuredHeight();
widthSpecSize = content.getMeasuredWidth();
if (handle.getMeasuredWidth() > widthSpecSize)
widthSpecSize = handle.getMeasuredWidth();
}
setMeasuredDimension(widthSpecSize, heightSpecSize);
}
private boolean mVertical;
private int mTopOffset;
直接把这段copy 到需要重写的抽屉类中,测试,搞定。
但是发现左边的那个图标又不能点击了,变成了触摸,就是有一定位移才能改变他的变量。
经过多番努力,改了一下,把那个按钮放在一个布局里面再对布局进行点击监听,一切搞定~~
测试这个抽屉用的activity:
Java代码
public class MainActivity extends Activity {
private MySlidingDrawer mdrawer;// 抽屉
private ImageButton mbutton;// 抽屉拉动按钮
private LinearLayout otherHandler;
private LinearLayout bottomRows;// 抽屉真正的内容
private Button test;
private TextView tv_top;
private Button btn_add_cut;// 真实抽屉左上角按钮
int i = 1;// 定义成员变量,协助点击左上角按钮时改变图标,点击+变成2,点击-变成1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
findview();
addlistener();
}
/** 初始化组件 */
private void findview() {
tv_top = (TextView) this.findViewById(R.id.tvCurrentPrice);
test = (Button) this.findViewById(R.id.buttontest);
mdrawer = (MySlidingDrawer) findViewById(R.id.stockDrawer);
// 传入抽屉手柄的id
mdrawer.setHandleId(R.id.mbutton);
mdrawer.setTouchableIds(new int[] { R.id.otherHandler });
mbutton = (ImageButton) findViewById(R.id.mbutton);
otherHandler = (LinearLayout) this.findViewById(R.id.otherHandler);
bottomRows = (LinearLayout) findViewById(R.id.bottomRows);
btn_add_cut = (Button) findViewById(R.id.btn_add_cut);
}
/**
* 给各个组建添加事件监听
*/
private void addlistener() {
test.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tv_top.setText("8585");
}
});
// 抽屉打开
mdrawer.setOnDrawerOpenListener(new MySlidingDrawer.OnDrawerOpenListener() {
public void onDrawerOpened() {
mbutton.setImageResource(R.drawable.down);
}
});
// 抽屉关闭
mdrawer.setOnDrawerCloseListener(new MySlidingDrawer.OnDrawerCloseListener() {
public void onDrawerClosed() {
mbutton.setImageResource(R.drawable.up);
}
});
// 抽屉正在拉动或停止拉动
mdrawer.setOnDrawerScrollListener(new MySlidingDrawer.OnDrawerScrollListener() {
public void onScrollStarted() {
}
public void onScrollEnded() {
}
});
btn_add_cut.setOnClickListener(new ButtonAddCutListener());
//
// 真实抽屉,非头部部分,在打开状态点击时关闭抽屉
bottomRows.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mdrawer.isOpened()) {
mdrawer.animateClose();
}
}
});
// otherHandler.setOnClickListener(new ButtonAddCutListener());
}
/** 抽屉左上角按钮点击改变图片事件 */
private class ButtonAddCutListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (i) {
case 1:
btn_add_cut.setBackgroundDrawable(getResources().getDrawable(
R.drawable.cut));
// btn_add_cut_on.setImageResource(R.drawable.cut);
i = 2;
System.out.println("+");
break;
case 2:
btn_add_cut.setBackgroundDrawable(getResources().getDrawable(
R.drawable.add));
// btn_add_cut_on.setImageResource(R.drawable.add);
i = 1;
System.out.println("-");
break;
}
}
}
}
算了,先贴个效果图:
这个情况是抽屉关着的时候:
这个情况是抽屉开着的时候
这是股票的一个抽屉。 然后boss给我说还有3个,顿时纠结,幸亏把内容最为丰富的股票给先搞定了。
。。。。就是这样,一开始就想着把抽屉的手柄写大点,用一个LinearLayout布局来做手柄,但是这样一来,发现布局里面的所有的按钮都相应了我的点击事件,擦。在抽屉手把位置的左边,有个按钮,点击一下会变成减号,但是如果是这样的话,那么我只要一点手柄,他也跟着变了。寻找了一些方法,未果,终于在csdn的一个问题帖子上找到了类似的情况。
基本的思路就是,先拦截了所有抽屉手柄的触摸事件,然后在找出用户想作为手柄的控件id,以及他们的屏幕位置。当点击到那些位置的时候,再做判断。
直接上代码,比较少代码就能实现的,理解起来也不困难,当然,要熟悉Android的控件所对应的实现方法会更简单:
Java代码
public class MySlidingDrawer extends SlidingDrawer {
private int mHandleId = 0; // 抽屉行为控件ID
private int[] mTouchableIds = null; // Handle 部分其他控件ID
public int getHandleId() {
return mHandleId;
}
public void setHandleId(int mHandleId) {
this.mHandleId = mHandleId;
}
public int[] getTouchableIds() {
return mTouchableIds;
}
public void setTouchableIds(int[] mTouchableIds) {
this.mTouchableIds = mTouchableIds;
}
public MySlidingDrawer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MySlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/*
* 获取控件的屏幕区域
*/
public Rect getRectOnScreen(View view) {
Rect rect = new Rect();
int[] location = new int[2];
View parent = view;
if (view.getParent() instanceof View) {
parent = (View) view.getParent();
}
parent.getLocationOnScreen(location);
view.getHitRect(rect);
rect.offset(location[0], location[1]);
return rect;
}
// 拦截触摸事件,用以修改事件
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// 确定控件的屏幕区域
int[] location = new int[2];
int x = (int) event.getX();
int y = (int) event.getY();
this.getLocationOnScreen(location);
x += location[0];
y += location[1];
// handle部分独立按钮,循环寻找非抽屉手柄的布局。
if (mTouchableIds != null) {
for (int id : mTouchableIds) {
View view = findViewById(id);
Rect rect = getRectOnScreen(view);
if (rect.contains(x, y)) {
Log.i("MySlidingDrawer on touch", String.format(
"Action=%d Button=%s", event.getAction(),
((LinearLayout) view).getContext().toString()));
// return
boolean result = view.dispatchTouchEvent(event);
Log.i("MySlidingDrawer dispatchTouchEvent", "" + result);
return false;
}
}
}
// 抽屉行为控件,本想同上,写成数组,寻找多个手柄,但是这样就没有了抽屉拖动效果
if (event.getAction() == MotionEvent.ACTION_DOWN && mHandleId != 0) {
View view = findViewById(mHandleId);
Log.i("MySlidingDrawer on touch", String.format("%d,%d", x, y));
Rect rect = getRectOnScreen(view);
Log.i("MySlidingDrawer handle screen rect", String
.format("%d,%d %d,%d", rect.left, rect.top, rect.right,
rect.bottom));
if (rect.contains(x, y)) {// 点击抽屉控件时交由系统处理
Log.i("MySlidingDrawer", "Hit handle");
} else {
return false;
}
}
return super.onInterceptTouchEvent(event);
}
// 获取触屏事件
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
大概就是这样的重写。
再来是布局文件:
<?xml version="1.0" encoding="UTF-8"?>
Xml代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<Button android:id="@+id/buttontest" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:text="test" />
<!-- bottom menu -->
<!-- 股票类 -->
<com.quan.MySlidingDrawer android:id="@+id/stockDrawer"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:handle="@+id/handleStock"
android:content="@+id/contentStock" android:visibility="visible">
<!-- top view 3 rows -->
<LinearLayout android:layout_width="fill_parent"
android:id="@+id/handleStock" android:layout_height="85dip"
android:orientation="vertical">
<LinearLayout android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_gravity="center">
<ImageButton android:layout_width="60dip" android:id="@+id/mbutton"
android:layout_height="10dip" android:src="@drawable/up"
android:layout_gravity="center" />
</LinearLayout>
<!-- top left -->
<LinearLayout android:layout_height="75dip"
android:layout_width="fill_parent" android:orientation="horizontal"
android:id="@+id/otherHandler" android:background="#000">
<!-- top left -->
<RelativeLayout android:id="@+id/topLeft"
android:layout_width="39dip" android:layout_height="75dip"
android:orientation="vertical">
<Button android:layout_width="30dip" android:layout_height="30dip"
android:id="@+id/btn_add_cut" android:layout_alignParentTop="true"
android:layout_alignParentLeft="true" android:layout_gravity="center_vertical"
android:focusable="true" android:background="@drawable/add" />
</RelativeLayout>
<RelativeLayout android:layout_width="120dip"
android:layout_height="75dip">
<TextView android:layout_height="50dip" android:text="2616.99"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" android:gravity="right"
android:id="@+id/tvCurrentPrice" android:textColor="#f00"
android:textSize="30dip" android:layout_gravity="center_vertical" />
<TextView android:text="+22.50" android:textColor="#f00"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" android:id="@+id/tvUpDown" />
<TextView android:layout_height="wrap_content"
android:text="0.21%" android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" android:gravity="right"
android:textColor="#f00" android:id="@+id/tvAmplitude" />
</RelativeLayout>
<View android:layout_width="1dip" android:layout_height="fill_parent"
android:background="#ff0000" />
<!-- top right -->
<TableLayout android:id="@+id/topRight"
android:layout_width="159dip" android:layout_height="fill_parent"
android:orientation="vertical">
<TableRow>
<TextView android:text="委比" android:textColor="#848684"
android:layout_height="24dip" android:layout_width="70dip"
android:gravity="left" />
<TextView android:id="@+id/tvAppoint" android:text="2.3%"
android:textColor="#f00" android:layout_height="24dip"
android:layout_width="89dip" android:gravity="right"
android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:layout_width="fill_parent"
android:background="#f00" />
<TableRow>
<TextView android:text="委差" android:textColor="#848684"
android:layout_height="24dip" android:layout_width="70dip"
android:gravity="left" />
<TextView android:id="@+id/tvPoorCom" android:text="32"
android:textColor="#f00" android:layout_height="24dip"
android:layout_width="89dip" android:gravity="right"
android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:layout_width="fill_parent"
android:background="#f00" />
<TableRow>
<TextView android:text="量比" android:textColor="#848684"
android:layout_height="24dip" android:layout_width="70dip"
android:gravity="left" />
<TextView android:id="@+id/tvReQuantity" android:text="-2.45"
android:textColor="#0f0" android:layout_height="24dip"
android:layout_width="89dip" android:gravity="right"
android:paddingRight="2dip" />
</TableRow>
</TableLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout android:id="@+id/contentStock"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:background="#000">
<View android:layout_height="1dip" android:layout_width="fill_parent"
android:background="#f00" />
<!-- bottom rows -->
<LinearLayout android:id="@+id/bottomRows"
android:layout_height="253dip" android:layout_width="fill_parent"
android:orientation="horizontal">
<!-- left table -->
<TableLayout android:layout_height="fill_parent"
android:layout_width="160dip">
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="均价" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="总手" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="现手" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/CURVOL" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="金额" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/MONEY" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="外盘" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买一" android:gravity="left" />
<TextView android:text="2539.82" android:textColor="#f00"
android:layout_height="25dip" android:layout_width="80dip"
android:gravity="center" />
<TextView android:text="23" android:textColor="#AE8B00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买二" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买三" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买四" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="买五" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" android:paddingRight="2dip" />
</TableRow>
</TableLayout>
<!-- right table -->
<TableLayout android:layout_height="fill_parent"
android:layout_width="160dip">
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="昨收" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="开盘" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/OPEN" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="最高" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/MAX" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="最低" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/MIN" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="内盘" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:id="@+id/INNER_TRAY" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<View android:layout_height="1dip" android:background="#f00" />
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖一" android:gravity="left" />
<TextView android:text="2549.82" android:textColor="#f00"
android:layout_height="25dip" android:layout_width="80dip"
android:gravity="center" />
<TextView android:text="45" android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖二" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖三" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖四" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#C39C00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
<TableRow>
<TextView android:textColor="#848684"
android:layout_height="25dip" android:layout_width="40dip"
android:text="卖五" android:gravity="left" />
<TextView android:textColor="#f00" android:layout_height="25dip"
android:layout_width="80dip" android:gravity="center" />
<TextView android:textColor="#AE8B00"
android:layout_height="25dip" android:layout_width="40dip"
android:gravity="right" />
</TableRow>
</TableLayout>
</LinearLayout>
</LinearLayout>
</com.quan.MySlidingDrawer>
</RelativeLayout>
做完这些之后又把那三个布局写完,发现。。。你妹的,原来的布局是用一个相对布局来控制抽屉的拉伸长度。其他3个内容都没这么多,所以3个的下面都是空的,又搞笑呢。接着寻找抽屉适配内容进行长度控制。
又是重写,烦躁的很啊。直接代码,主要思想就是先测量里面内容的高度。因为抽屉本身是没有写wrap_content(即适配内容高度来进行拉伸高度控制)的,所以重写的应该是这个部分。在一个英文的编程疑难解答上找到了答案。
onMeasure是测量控件宽高的方法。setMeasuredDimension是设置到布局里~~~
Java代码
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 = getHandle();
final View content = getContent();
measureChild(handle, widthMeasureSpec, heightMeasureSpec);
int extra = handle.getHeight() / 6;
System.out.println(handle.getMeasuredHeight() + " "
+ content.getHeight());
if (mVertical) {
int height = heightSpecSize - handle.getMeasuredHeight()/* + extra */
- mTopOffset;
content.measure(widthMeasureSpec,
MeasureSpec.makeMeasureSpec(height, heightSpecMode));
heightSpecSize = handle.getMeasuredHeight() /* + extra */
+ mTopOffset + content.getMeasuredHeight();
widthSpecSize = content.getMeasuredWidth();
if (handle.getMeasuredWidth() > widthSpecSize)
widthSpecSize = handle.getMeasuredWidth();
}
setMeasuredDimension(widthSpecSize, heightSpecSize);
}
private boolean mVertical;
private int mTopOffset;
直接把这段copy 到需要重写的抽屉类中,测试,搞定。
但是发现左边的那个图标又不能点击了,变成了触摸,就是有一定位移才能改变他的变量。
经过多番努力,改了一下,把那个按钮放在一个布局里面再对布局进行点击监听,一切搞定~~
测试这个抽屉用的activity:
Java代码
public class MainActivity extends Activity {
private MySlidingDrawer mdrawer;// 抽屉
private ImageButton mbutton;// 抽屉拉动按钮
private LinearLayout otherHandler;
private LinearLayout bottomRows;// 抽屉真正的内容
private Button test;
private TextView tv_top;
private Button btn_add_cut;// 真实抽屉左上角按钮
int i = 1;// 定义成员变量,协助点击左上角按钮时改变图标,点击+变成2,点击-变成1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
findview();
addlistener();
}
/** 初始化组件 */
private void findview() {
tv_top = (TextView) this.findViewById(R.id.tvCurrentPrice);
test = (Button) this.findViewById(R.id.buttontest);
mdrawer = (MySlidingDrawer) findViewById(R.id.stockDrawer);
// 传入抽屉手柄的id
mdrawer.setHandleId(R.id.mbutton);
mdrawer.setTouchableIds(new int[] { R.id.otherHandler });
mbutton = (ImageButton) findViewById(R.id.mbutton);
otherHandler = (LinearLayout) this.findViewById(R.id.otherHandler);
bottomRows = (LinearLayout) findViewById(R.id.bottomRows);
btn_add_cut = (Button) findViewById(R.id.btn_add_cut);
}
/**
* 给各个组建添加事件监听
*/
private void addlistener() {
test.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tv_top.setText("8585");
}
});
// 抽屉打开
mdrawer.setOnDrawerOpenListener(new MySlidingDrawer.OnDrawerOpenListener() {
public void onDrawerOpened() {
mbutton.setImageResource(R.drawable.down);
}
});
// 抽屉关闭
mdrawer.setOnDrawerCloseListener(new MySlidingDrawer.OnDrawerCloseListener() {
public void onDrawerClosed() {
mbutton.setImageResource(R.drawable.up);
}
});
// 抽屉正在拉动或停止拉动
mdrawer.setOnDrawerScrollListener(new MySlidingDrawer.OnDrawerScrollListener() {
public void onScrollStarted() {
}
public void onScrollEnded() {
}
});
btn_add_cut.setOnClickListener(new ButtonAddCutListener());
//
// 真实抽屉,非头部部分,在打开状态点击时关闭抽屉
bottomRows.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mdrawer.isOpened()) {
mdrawer.animateClose();
}
}
});
// otherHandler.setOnClickListener(new ButtonAddCutListener());
}
/** 抽屉左上角按钮点击改变图片事件 */
private class ButtonAddCutListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (i) {
case 1:
btn_add_cut.setBackgroundDrawable(getResources().getDrawable(
R.drawable.cut));
// btn_add_cut_on.setImageResource(R.drawable.cut);
i = 2;
System.out.println("+");
break;
case 2:
btn_add_cut.setBackgroundDrawable(getResources().getDrawable(
R.drawable.add));
// btn_add_cut_on.setImageResource(R.drawable.add);
i = 1;
System.out.println("-");
break;
}
}
}
}