Android ---SlidingDrawer中handle布局中的点击事件处理

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本身的操作,处理打开或关闭。然后将要响应的其他控件设置进去,然后分别处理。

 

 

 

你可能感兴趣的:(android原生)