0

ボタン画像の透明部分に基づいて、Android用の不規則な形状の画像ボタンを作成したいと思います。

基本的に、ボタンの透明な領域をクリックすると、イベントを処理する代わりに、その下のビューに「下方」に伝播する必要があります。したがって、これらのボタンの 2 つを重ねると、実際には1 つ (が'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 docs に基づくと、public boolean interceptTouchEvent(MotionEvent e)このタイプの動作の可能な解決策のように見えますが、ViewGroupクラスで定義されているため、ImageViewサブクラスには使用できません。

タッチイベントの処理/伝播の経験があり、私の質問に対する答えを知っている場合は、返信してください!

4

1 に答える 1

0

タッチの制御に関して同様の問題がありました。私の解決策は、独自のタッチを処理できるように WebView を拡張することでした。大きなTextViewでも同じことをしました。最初の zip ファイルのソースは次のとおりです。

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

ボタンに関しては、これが役立つかどうかわかりません。しかし、通常のボタンに画像を配置すると、ImageButton を使用する場合とは異なる結果が得られました。あなたのニーズを満たすものがそこにあるかもしれません。また、これを試したことがあるかもしれませんが、XML のマージンを使用してボタンを別のボタンの上に配置できます。プレスを下に渡すことに関しては、私の WebView ソリューションのようなものでプレス座標をインターセプトし、オーバーラップを「シミュレート」する必要があります。これらはすべてシミュレーションなので、引用符を使用しますよね?ユーザーに体験してもらいたいことをやっているような気分にさせましょう。ボンネットの下に何があるかは問題ではありません。

于 2013-05-16T23:25:07.373 に答える