1

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

在此处输入图像描述

绿色的观点是VISIBLE,红色的一个是INVISIBLE。问题是我需要红色视图才能将触摸传递给底层窗口,但默认情况下不需要。

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

有什么方法可以覆盖INVISIBLE状态下的默认触摸处理?


这是一个实际的屏幕截图,可以让我的问题更清楚:

在此处输入图像描述

此外,我必须重写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);
}
4

2 回答 2

0

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

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

于 2013-08-29T20:10:43.310 回答
0

我最终做的是计算两组视图尺寸:最大可能(红色区域的大小)和当前(绿色区域)。当子视图被隐藏或显示时,我将窗口的widthand设置为当前尺寸,然后将最大尺寸和当前尺寸之间的差异设置为和的参数。heightLayoutParamsyxLayoutParams

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

于 2013-09-02T21:51:13.433 回答