安卓:我能创建一个非矩形的视图/画布吗?例如圆形?

12

我有一个圆形的视图,悬浮在主内容上方(->沿着z轴方向从屏幕中出来)。当某人点击屏幕时,如果它覆盖了主视图,我希望选择主要内容或悬浮在上方的视图。

到目前为止,这个功能已经完美地实现了。我在透明画布上有一个圆形的项目。这意味着您可以看到圆圈外面的所有背景。但是,您无法选择它,因为它仍然是悬浮画布,只是用透明颜色绘制而已。

现在我想知道,为了解决这个问题,是否可能使视图/画布本身成为圆形?


更新

我添加了一张图片以更好地说明我想要实现的效果。 alt text


你能自己处理碰撞检测吗?在触摸事件中获取XY坐标,如果超出半径范围则不处理输入? - Nathan Schwermann
好的,我已经有了。但是,我希望触摸事件由后台的主层处理,例如文本框。 - znq
如果您在触摸事件中返回false,则应将该事件传递给下一个处于排队中的对象。有时,这取决于布局层次结构,很容易出现错误,但是您正在正确的轨道上。如果您发布布局XML文件和onTouch监听器,我们可能会想出一些解决方案。 - Nathan Schwermann
@schwiz:我为此创建了一个单独的问题:https://dev59.com/_W865IYBdhLWcg3wZdtW(我之所以为此创建一个单独的问题,是因为我仍然想知道是否可以拥有一个圆形画布)我已经返回false并记录了触摸监听器,但它甚至没有进入层次结构中的下一个元素(PopupWindow)。 - znq
3个回答

4
据我所知,这是不可能的。我已经查看了git.kernel.org上View.java的源代码,并发现它基于Rect类 - rects定义位置、大小、无效区域等(“视图的几何形状就是一个矩形。”- 来自View.java中的注释)。
至于Canvas类-它通常是在Bitmap或GL上构建的。Bitmap肯定是一个矩形(一个矩阵),因此画布似乎也代表一个矩形。如果使用GL,则指定了一个视口(也是一个矩形)。
最明显的方法似乎是检查传递给onTouch()方法的坐标是否适合您的区域,如果不适合则返回false。然后事件将传递到下面的View并且它应该处理该事件。

1
感谢zserge提供详细的答案。最后提到的一点正是我现在正在做的,但我还有其他问题,我在这里描述了:https://dev59.com/_W865IYBdhLWcg3wZdtW - znq

1

-3

也许我没有表达清楚,但我添加了一张图片来澄清。我不认为 Selector 是解决方案,但如果我错了,请告诉我。 - znq
你能解释一下那个圆圈是什么吗?它是一个图像,应该始终显示吗?它应该有一个选择器吗?我可以使用dpad访问它吗? - Macarse
这个圆圈是一种悬浮在主层上方的“弹出式”窗口。它位于z轴上,超出了主内容视图层。你可以将其视为AlertDialog,但是它是圆形而不是矩形,并且具有从背景中选择项目的可能性。 - znq
@Stefan Klumpp:它应该可以使用选择器,你能贴一些代码来重现这个问题吗? - Macarse
@Macarse:也许你是对的。难道你回答中的链接有误,而你试图指向那个链接?http://developer.android.com/reference/java/nio/channels/Selector.html这就是为什么我感到困惑,并认为你所说的 Selector 不正确。 - znq
实际上,我再次查看了两个链接,仍然不知道如何在其中使用Selector。稍后我会准备一些代码并将其添加到我的问题中。 - znq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接