Skip to content

Instantly share code, notes, and snippets.

@JakeSteam
Created January 7, 2017 01:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JakeSteam/41e368bf5ffe27bc690713ee074c64ab to your computer and use it in GitHub Desktop.
Save JakeSteam/41e368bf5ffe27bc690713ee074c64ab to your computer and use it in GitHub Desktop.
"Android: Displaying Levels At Optimum Zoom" core functions for GameDevAlgorithms
public TileDisplaySetup setupTileDisplay(PuzzleDisplayer puzzleDisplayer, List<Tile> tiles, ZoomableViewGroup tileContainer, Tile selectedTile, ImageView selectedTileImage, boolean isEditor) {
tileContainer.removeAllViews();
Setting minimumMillisForDrag = Setting.get(Constants.SETTING_MINIMUM_MILLIS_DRAG);
int dragDelay = minimumMillisForDrag != null ? minimumMillisForDrag.getIntValue() : 200;
Pair<Integer, Integer> maxXY = TileHelper.getMaxXY(tiles);
DisplayValues displayValues = getDisplayValues(puzzleDisplayer.getActivity(), maxXY.first + 1, maxXY.second + 1);
float optimumScale = displayValues.getZoomFactor();
int topOffset = displayValues.isLeftOffset() ? 0 : displayValues.getOffset();
int leftOffset = displayValues.isLeftOffset() ? displayValues.getOffset() : 0;
tileContainer.setScaleFactor(optimumScale, true);
tileContainer.removeAllViews();
for (final Tile tile : tiles) {
if (!puzzleDisplayer.displayEmptyTile() && tile.getTileTypeId() == Constants.TILE_EMPTY) {
continue;
}
ZoomableViewGroup.LayoutParams layoutParams = new ZoomableViewGroup.LayoutParams(ZoomableViewGroup.LayoutParams.WRAP_CONTENT, ZoomableViewGroup.LayoutParams.WRAP_CONTENT);
int leftPadding = leftOffset + (tile.getY() + tile.getX()) * (getTileWidth() / 2);
int topPadding = topOffset + (tile.getX() + maxXY.second - tile.getY()) * (getTileHeight() / 2);
layoutParams.setMargins(leftPadding, topPadding, 0, 0);
int drawableId = getTileDrawableId(puzzleDisplayer.getActivity(), tile.getTileTypeId(), tile.getRotation());
ImageView image = createTileImageView(puzzleDisplayer, tile, drawableId, dragDelay);
// Make sure we always have a tile selected
if (isEditor && (selectedTile == null || selectedTileImage == null)) {
image.setAlpha(0.75f);
image.setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
selectedTileImage = image;
selectedTile = tile;
TextView selectedTileText = (TextView) puzzleDisplayer.getActivity().findViewById(R.id.selectedTileText);
if (selectedTileText != null) {
((TextView) puzzleDisplayer.getActivity().findViewById(R.id.selectedTileText)).setText(tile.getName());
}
}
tileContainer.addView(image, layoutParams);
}
return new TileDisplaySetup(selectedTileImage, optimumScale);
}
private DisplayValues getDisplayValues(Activity activity, int xTiles, int yTiles) {
DisplayMetrics displayMetrics = getSizes(activity);
int screenHeight = displayMetrics.heightPixels;
int screenWidth = displayMetrics.widthPixels;
double totalTilesAmount = (xTiles + yTiles) / 2.0;
int puzzleHeight = (int) (totalTilesAmount * getTileHeight());
int puzzleWidth = (int) (totalTilesAmount * getTileWidth());
float xZoomFactor = screenWidth / (float) (puzzleWidth);
float yZoomFactor = (screenHeight / (float) (puzzleHeight)) / 2;
float zoomFactor = Math.min(xZoomFactor, yZoomFactor);
int offset = puzzleHeight / 2;
return new DisplayValues(zoomFactor, offset, yZoomFactor < xZoomFactor);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment