【发布时间】:2012-08-28 15:41:23
【问题描述】:
我想要这样的五个按钮,一个按钮被其他四个按钮包围。就像这样:
我知道在 Android 中我们只能有方形视图,那么怎么可能做到这一点呢? OpenGL还是什么?任何人有任何相关的东西的链接?基本上我想要靠在一起的弯曲按钮。
【问题讨论】:
我想要这样的五个按钮,一个按钮被其他四个按钮包围。就像这样:
我知道在 Android 中我们只能有方形视图,那么怎么可能做到这一点呢? OpenGL还是什么?任何人有任何相关的东西的链接?基本上我想要靠在一起的弯曲按钮。
【问题讨论】:
我的猜测是,最终在自定义视图中执行此操作会更容易。
但是,如果您想使用股票视图,我建议您使用以下方法。首先,使用RelativeLayout 容器将四个外部按钮排列在一个2x2 网格中。然后定位中心按钮,使其与中心的网格重叠。将中心按钮放置在比周围四个按钮更高的 Z 位置(更靠近用户)。然后使用透明度作为按钮图像的一部分,让它们看起来像你想要的。然后(希望)尝试一下。如果 Z 顺序正确,则中心按钮将捕获原本会转到其他四个按钮之一的点击。
这实际上不会按原样工作,因为中心按钮方块会侵入周围的方块。我不知道它是否会起作用,但是您可以尝试用另一个按钮“碎片”网格替换中心按钮。除了中心按钮图像与网格单元重叠的位置之外,网格将具有空位置。您必须将其设置得足够精细以避免侵入外部按钮图像。
编辑:
我突然想到,也许你可以用一组TouchDelegate 对象来做到这一点。您将按照我最初描述的方式排列按钮,但只使 parent 容器可点击。它将使用五个TouchDelegates 来找出哪个按钮(如果有)在点击坐标下。不幸的是,TouchDelegate 仅适用于Rect 命中区域,这使我们离开了我们开始的地方。但是,您可以蚕食source of TouchDelegate 并定义自己的版本,该版本接受某种通用形状类,而不仅仅是Rect。 (形状类必须具有等同于 Rect.contains() 的属性才能测试命中。Android 中没有内置任何内容,但您可以轻松地为您拥有的特定形状编写自己的类。)
您可以通过将命中和委托逻辑直接放在父容器视图中来稍微简化代码,但我认为,拥有一个可重用的委托类将事件处理与容器本身分开会更简洁。
【讨论】:
您可以使用遮罩颜色,例如: 一个完全红色的按钮,就像您发布的图片一样,只需对红色按钮进行像素颜色检查,类似于:
bool insideMyAwsomeShapeButton(int mouse_x,int mouse_y) {
if get_image_pixel_color_at_pos(mouse_x,mouse_y) == rgbcolor(1,0,0)
{
return true;
}
return false; }
再一次,这只是一个想法,你必须在 android 上找到特定的 api 才能完成任务,比如检查像素颜色。
【讨论】: