我想根据按钮图像的透明区域为Android创建不规则形状的图像按钮。
基本上,如果您单击按钮的透明区域,而不是处理事件,它应该将其"向下"传播到其下方的视图。因此,如果您重叠其中两个按钮,您实际上可以单击'bottom'
按钮(重叠'top'
),如果您单击'top'
的透明区域但'bottom'
的非透明区域。
基于相同原理的iOS工作解决方案是例如OBShapedButton http://www.cocoacontrols.com/platforms/ios/controls/obshapedbutton
我的第一个想法是创建一个ImageButton
子类(CustomShapedButton
)来实现这个功能。以下代码可用于确定您是否单击了透明 are,给定实际可绘制状态和MotionEvent
。
public class CustomShapedButton extends ImageButton {
[...]
if (e.getAction() == MotionEvent.ACTION_UP)
{
// click coordinates of (MotionEvent e)
float x = e.getX();
float y = e.getY();
// get current state of drawable and the color under the click
StateListDrawable s = (StateListDrawable)this.getBackground();
int color = ((BitmapDrawable)s.getCurrent()).getBitmap().getPixel((int)x, (int)y);
Log.d(TAG, "custom shaped button clicked at x: "+x+" y: "+y+" with color: "+color);
if (color != 0)
{
// normal region clicked, should count as click
// ...
}
else
{
// transparent region clicked, should NOT count as click
// ...
}
}
[...]
}
我应该将上面的代码放在哪里以获得正确的功能?我试图覆盖public boolean onTouchEvent(MotionEvent e)
和public boolean dispatchTouchEvent(MotionEvent e)
方法,但没有运气(也许我只是没有找到每种情况的正确返回值)。
根据 Android API 文档,public boolean interceptTouchEvent(MotionEvent e)
看起来像是此类行为的可能解决方案,但它是在 ViewGroup
类中定义的,因此不能用于ImageView
子类。
如果您有处理/传播触摸事件的经验并知道我问题的答案,请回复!
我在控制触摸方面遇到了类似的问题。我的解决方案是扩展 WebView,以便它处理自己的触摸。我也用一个大的TextView做了同样的事情。您可以在此zip文件中找到第一个的源代码:
http://this-voice.org/dnlds/MoDaBrowserGNU.zip
至于按钮,我不知道这是否有帮助。但是我将图像放在常规按钮上与使用图像按钮的结果不同。您可能会在那里找到满足您需求的东西。另外,也许您已经尝试过此操作,但是您可以使用XML中的边距将一个按钮放在另一个按钮上。至于向下传递新闻,您必须在类似于我的 WebView 解决方案中拦截新闻坐标并"模拟"重叠。我使用引号是因为所有这些东西都是模拟的,对吧?让用户觉得他在做你想让他体验的事情。引擎盖下是什么并不重要。