我想根据按钮图像的透明区域为 Android 创建形状不规则的图像按钮。
基本上,如果您单击按钮的透明区域,而不是处理事件,它应该将其“向下”传播到其下方的视图。因此,如果您重叠其中两个按钮,您实际上可以单击'bottom'
一个(由 重叠'top'
),如果您单击 的透明区域'top'
但不透明区域'bottom'
。
基于相同原理的 iOS 工作解决方案是例如 OBShapedButton http://www.cocoacontrols.com/platforms/ios/controls/obshapedbutton
我的第一个想法是创建一个ImageButton
子类 ( CustomShapedButton
) 来实现这个功能。以下代码可用于确定您是否单击了透明区域,给定实际的可绘制状态和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
子类。
如果您有处理/传播触摸事件的经验并且知道我的问题的答案,请回复!