私は現在、複数の画像を (としてImageView's
) 重ねて表示する Android アプリを開発しています。レイヤーが現在どのように構成されているかを次に示します。
- 背景レイヤー: 画面全体をスケーリングし、クリック可能にする必要があります
- 前景レイヤー: 画面全体をスケーリングし、クリック可能である必要があり、ユーザーが背景レイヤーの一部を見ることができる透明度が含まれています
私が直面している問題は、前景レイヤーにあります。メソッドをイメージビューに割り当ててonClick()
いますが、透明度を含む部分だけでなく、表示されている画像の部分にヒットするかどうかにかかわらず、メソッドが呼び出されています。onClick()
ユーザーがそのイメージビューの透明でない部分をクリックしたときにのみ、フォアグラウンドの ImageViewメソッドが呼び出されるようにします。
シナリオは次のようになります。
対角線は、フォアグラウンド イメージの透明部分を表します。ユーザーがこのスペースに触れた場合、前景画像ではなく背景画像にアクセスできるようにします。ご協力いただきありがとうございます。
これが私が実装したソリューションです(以下の回答に感謝します):
//ontouchlistener - gets X and Y from event
private void setClick(View view)
{
view.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int imageId = getImageId((int)event.getX(), (int)event.getY());
if (imageId >= 0)
performActions(imageId);
return false;
}
});
}
//get the ID of the first imageview (starting from foreground,
//working backwards) which contains a non-transparent pixel
private int getImageId(int x, int y)
{
ViewGroup parent = (ViewGroup) findViewById(R.id.relative_layout);
for (int a = parent.getChildCount()-1; a >= 0; a--)
{
if (parent.getChildAt(a) instanceof ImageView)
if (!checkPixelTransparent((ImageView)parent.getChildAt(a), x, y))
return parent.getChildAt(a).getId();
}
return -1;
}
//get bitmap from imageview, get pixel from x, y coord
//check if pixel is transparent
private boolean checkPixelTransparent(ImageView iv, int x, int y)
{
Bitmap bitmap = ((BitmapDrawable) iv.getDrawable()).getBitmap();
if (Color.alpha(bitmap.getPixel(x, y)) == 0)
return true;
else
return false;
}