SlidingDrawer控件虽然已经Android6.0之后不推荐使用了,但是还能用。
handle中有时会有多个控件,但是点击响应时他会作为一个整体进行操作。一般情况下,通过setOnDrawerOpenListener、setOnDrawerCloseListener这两个监听分别处理打开和关闭的事件。但是有时我们需要分别处理handle中不同的事件,他本身是不支持的,这样就需要我们自己定义,重写他的方法。(这也可能是官方不推荐的原因吧,还有处理打开和关闭用了两个监听,封装的也不是很完美,淘汰是必然)
此处自定义为复制某论坛内容,可用。
public class MySlidingDrawer extends SlidingDrawer {
private int mHandleId = 0; //抽屉行为控件ID
private int[] mTouchableIds = null; //Handle 部分其他控件ID
public int[] getTouchableIds() {
return mTouchableIds;
}
public void setTouchableIds(int[] mTouchableIds) {
this.mTouchableIds = mTouchableIds;
}
public int getHandleId() {
return mHandleId;
}
public void setHandleId(int mHandleId) {
this.mHandleId = mHandleId;
}
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;
}
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)){
//return
boolean result = view.dispatchTouchEvent(event);
return false;
}
}
}
// 抽屉行为控件
if(event.getAction() == MotionEvent.ACTION_DOWN && mHandleId != 0){
View view = findViewById(mHandleId);
Rect rect = getRectOnScreen(view);
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);
}
}
在Activity 中的用法如下:
sliding_drawer.setHandleId(R.id.tv_handle);
sliding_drawer.setTouchableIds(new int[]{R.id.iv_BtnNavigation, R.id.tv_handle});
其中的意思就是:handle中有多个控件,其中设置一个为响应handle本身的操作,处理打开或关闭。然后将要响应的其他控件设置进去,然后分别处理。