Вот три метода с комментариями для проверки столкновения непрозрачных пикселей двух картинок с оптимизацией.
//проверка столкновения непрозрачных пикселей двух картинок
private boolean isCollisionDetected(Bitmap bitmap1, int x1, int y1, Bitmap bitmap2, int x2, int y2)
{
Rect bounds1 = new Rect(x1, y1, x1 + bitmap1.getWidth(), y1 + bitmap1.getHeight());
Rect bounds2 = new Rect(x2, y2, x2 + bitmap2.getWidth(), y2 + bitmap2.getHeight());
if (Rect.intersects(bounds1, bounds2))
{
Rect collisionBounds = getCollisionBounds(bounds1, bounds2);
for (int i = collisionBounds.left; i < collisionBounds.right; i++) {
for (int j = collisionBounds.top; j < collisionBounds.bottom; j++)
{
int bitmap1Pixel = bitmap1.getPixel(i - x1, j - y1);
int bitmap2Pixel = bitmap2.getPixel(i - x2, j - y2);
if ((isFilled(bitmap1Pixel)) && (isFilled(bitmap2Pixel))) {
return true;
}
}
}
}
return false;
}
//получить прямоугольную область , которая образуется пересечением двух прямоугольников
private Rect getCollisionBounds(Rect rect1, Rect rect2)
{
int left = Math.max(rect1.left, rect2.left);
int top = Math.max(rect1.top, rect2.top);
int right = Math.min(rect1.right, rect2.right);
int bottom = Math.min(rect1.bottom, rect2.bottom);
return new Rect(left, top, right, bottom);
}
//проверить пиксель на непрозрачность
private boolean isFilled(int pixel)
{
return pixel != 0;
}