0

我想根据按钮图像的透明区域为 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子类。

如果您有处理/传播触摸事件的经验并且知道我的问题的答案,请回复!

4

1 回答 1

0

我在控制触摸方面也遇到过类似的问题。我的解决方案是扩展 WebView 以便它处理自己的操作。我也用一个大的 TextView 做了同样的事情。您可以在此 zipfile 中找到第一个的源代码:

http://this-voice.org/dnlds/MoDaBrowserGNU.zip

至于按钮,我不知道这是否会有所帮助。但是将图像放在常规按钮上的结果与使用 ImageButton 的结果不同。您可能会在那里找到满足您需求的东西。此外,也许您已经尝试过了,但是您可以使用 XML 中的边距将一个按钮放在另一个按钮上。至于向下传递新闻,您将不得不在我的 WebView 解决方案中截取新闻坐标并“模拟”重叠。我使用引号是因为所有这些东西都是模拟的,对吧?努力让用户感觉他正在做你想让他体验的事情。引擎盖下的内容并不重要。

于 2013-05-16T23:25:07.373 回答