我想创建透明的系统覆盖窗口,它有几个圆形视图:
绿色视图为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);
}
答案 0 :(得分:0)
创建自定义视图以执行此操作。在这种情况下,您不需要任何与可见不可见相关的技巧 - 您决定什么是可点击区域,以及决定哪个区域将改变状态(如在触摸事件中绘制为pressed
)。因此,您的自定义视图应该具有所需区域的大小,但在onDraw()
中,您只能在较小的内部区域绘制更改。
以下是有关如何创建自定义视图的基础知识:http://developer.android.com/training/custom-views/index.html
答案 1 :(得分:0)
我最终做的是计算两组视图尺寸:最大可能(红色区域的大小)和当前(绿色区域)。隐藏或显示子视图后,我将窗口width
的{{1}}和height
设置为当前维度,然后将最大和当前维度之间的差异设置为LayoutParams
和{{1}参数y
。
由于某些原因,应用修改后的x
触发器测量/布局传递两次(这反过来导致视图“反弹”),但这似乎是全新的故事。