ボタン画像の透明部分に基づいて、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
サブクラスには使用できません。
タッチイベントの処理/伝播の経験があり、私の質問に対する答えを知っている場合は、返信してください!