使INVISIBLE视图句柄触摸为ACTION_OUTSIDE

时间:2013-08-29 20:06:25

标签: android android-layout android-custom-view

我想创建透明的系统覆盖窗口,它有几个圆形视图:

enter image description here

绿色视图为VISIBLE,红色视图为INVISIBLE。问题是我需要红色视图来将触摸传递给底层窗口,但默认情况下它不会。

我尝试将红色视图的可见性设置为GONE,但随后包含视图的整体大小发生了变化。由于我需要将包含视图捕捉到屏幕的右边缘,这意味着绿色视图的位置发生了变化,我不希望这样。

有没有办法覆盖INVISIBLE州的默认触控处理?


这是一个实际的截图,让我的问题更清晰:

enter image description here

另外,我必须覆盖dispatchTouchEvent()才能正确发送触摸事件:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    Circle target=null;
    int targetIndex=-1;
    for (int i=0; i<getChildCount(); i++) {
        Circle child=(Circle) getChildAt(i);
        if (child.viewMetrics.containsPoint(ev.getX(), ev.getY()) && (ev.getAction()==MotionEvent.ACTION_MOVE || child.isVisible())) {
            target=child;
            targetIndex=i;
            break;
        }
    }
    onMotionEvent(ev, target, targetIndex);
    Log.d(">| CircularLayout", "action: "+ev.getAction()+", target: "+target);
    return target!=null && target.dispatchTouchEvent(ev);
}

2 个答案:

答案 0 :(得分:0)

创建自定义视图以执行此操作。在这种情况下,您不需要任何与可见不可见相关的技巧 - 您决定什么是可点击区域,以及决定哪个区域将改变状态(如在触摸事件中绘制为pressed)。因此,您的自定义视图应该具有所需区域的大小,但在onDraw()中,您只能在较小的内部区域绘制更改。

以下是有关如何创建自定义视图的基础知识:http://developer.android.com/training/custom-views/index.html

答案 1 :(得分:0)

我最终做的是计算两组视图尺寸:最大可能(红色区域的大小)和当前(绿色区域)。隐藏或显示子视图后,我将窗口width的{​​{1}}和height设置为当前维度,然后将最大和当前维度之间的差异设置为LayoutParams和{{1}参数y

由于某些原因,应用修改后的x触发器测量/布局传递两次(这反过来导致视图“反弹”),但这似乎是全新的故事。