Как создать кусочки головоломки без использования маски?

Я пытаюсь создать игру-головоломку, и я хотел бы узнать об альтернативных способах создания головоломок без использования маски. В настоящее время у меня есть кусочки головоломки, взяв полное изображение, разбивая это изображение на четыре части (скажем, головоломка 2×2), а затем сохраняя и применяя маску к каждой части. Он выглядит следующим образом:

// create standard puzzle pieces arryPieceEndPos = new int[mCols][mRows]; arryPieceImg = new Bitmap[mCols * mRows]; arryIsPieceLocked = new boolean[mCols * mRows]; int pos = 0; for (int c = 0; c < mCols; c++) { for (int r = 0; r < mRows; r++) { arryPieceImg[pos] = Bitmap.createBitmap(mBitmap, c * mPieceWidth, r * mPieceHeight, mPieceWidth, mPieceHeight); arryIsPieceLocked[pos] = false; arryPieceEndPos[c][r] = pos; pos++; } } 

Затем я использую вспомогательный метод для нанесения маски на каждую часть

 private Bitmap maskMethod(Bitmap bmpOriginal, Bitmap bmpMask) { // adjust mask bitmap if size is not the size of the puzzle piece if (bmpMask.getHeight() != mPieceHeight || bmpMask.getWidth() != mPieceWidth) { Log.e("TEST", "Resize Error :: H (mask): " + bmpMask.getHeight() + " // W (mask): " + bmpMask.getWidth()); Log.d("TEST", "Resize Error :: H (norm): " + mPieceHeight + " // W (norm): " + mPieceWidth); } Canvas canvas = new Canvas(); Bitmap combine = Bitmap.createBitmap(bmpOriginal.getWidth(), bmpOriginal.getHeight(), Bitmap.Config.ARGB_8888); canvas.setBitmap(combine); Paint paint = new Paint(); paint.setFilterBitmap(false); canvas.drawBitmap(bmpOriginal, 0, 0, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawBitmap(bmpMask, 0, 0, paint); paint.setXfermode(null); return combine; } 

Я видел это сообщение> http://java.dzone.com/news/connect-pictures-android для соединения частей вместе, однако это не распространяется на генерирующие части программно без масок. Может ли кто-нибудь представить примеры кода, как это можно сделать? Единственный ключ, который у меня есть, это то, что я должен использовать Path, однако, я все еще не уверен, как это сделать. Заранее спасибо!

Кусок головоломки – довольно сложный вид для создания, но я могу помочь вам понять, как использовать путь. Вот ссылка на сайт разработчика: http://developer.android.com/reference/android/graphics/Path.html

Посмотрите на эту ссылку. Я сделал небольшую вещь для вас, чтобы начать. Единственное, что вам нужно выяснить, – это вырезать небольшой круг из пути, о котором я бы не знал. Я думаю, вам нужно заглянуть в отсечение, чтобы ваш путь прошел по кругу (вы также можете сделать обрезку для создания круга вне куска, я просто не делал обрезки раньше).

 private Bitmap getPuzzleBitmap(Bitmap bitmap) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); calculatePuzzlePath(bitmap.getWidth(), bitmap.getHeight()); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawPath(puzzlePath, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } private void calculatePuzzlePath(int width, int height) { float radius = (height / 2) - 5; float smallRadius = radius / 3; radius -= smallRadius * 2; float centerX = width/2; float centerY = height/2; puzzlePath = new Path(); // Bottom right puzzlePath.moveTo(centerX + radius, centerY + radius); // Top right puzzlePath.lineTo(centerX + radius, centerY - radius); // Center top puzzlePath.lineTo(centerX, centerY - radius); // Add outside circle to center top puzzlePath.addCircle(centerX, centerY - radius - ((radius / 3) / 2), radius / 3, Path.Direction.CCW); // Top left puzzlePath.lineTo(centerX - radius, centerY - radius); // Bottom left puzzlePath.lineTo(centerX - radius, centerY + radius); //Bottom right puzzlePath.lineTo(centerX + radius, centerY + radius); } 

Надеюсь, этого достаточно, чтобы начать с этого.

Удачи!