diff --git a/app/src/main/java/com/antsapps/triples/views/FoundTriplesView.java b/app/src/main/java/com/antsapps/triples/views/FoundTriplesView.java index cdef2298..302626d8 100644 --- a/app/src/main/java/com/antsapps/triples/views/FoundTriplesView.java +++ b/app/src/main/java/com/antsapps/triples/views/FoundTriplesView.java @@ -40,6 +40,7 @@ public interface OnSlotClickListener { private int mCardWidth; private int mCardHeight; private int mStackDisplacement; + private int mStackHorizDisplacement; private boolean mPlaceholderClickable = true; private final int mPadding; @@ -175,7 +176,7 @@ public Map getCardBoundsInWindow(int index, Set triple) { for (int i = 0; i < 3; i++) { Card card = sortedTriples.get(i); - int left = slotLeft + mPadding; + int left = slotLeft + mPadding + i * mStackHorizDisplacement; int top = slotTop + mPadding + i * mStackDisplacement; cardBounds.put( @@ -198,9 +199,13 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } mSlotWidth = width / COLUMNS; - mCardWidth = mSlotWidth - 2 * mPadding; + mCardWidth = + (int) + ((mSlotWidth - 2 * mPadding) + / (1 + 2 * TripleStackView.STACK_HORIZ_DISPLACEMENT_PERCENT)); mCardHeight = (int) (mCardWidth * CardView.HEIGHT_OVER_WIDTH); mStackDisplacement = (int) (mCardHeight * TripleStackView.STACK_DISPLACEMENT_PERCENT); + mStackHorizDisplacement = (int) (mCardWidth * TripleStackView.STACK_HORIZ_DISPLACEMENT_PERCENT); int stackHeight = mCardHeight + 2 * mStackDisplacement; mSlotHeight = stackHeight + 2 * mPadding; diff --git a/app/src/main/java/com/antsapps/triples/views/TripleExplanationView.java b/app/src/main/java/com/antsapps/triples/views/TripleExplanationView.java index a92c255c..9b603437 100644 --- a/app/src/main/java/com/antsapps/triples/views/TripleExplanationView.java +++ b/app/src/main/java/com/antsapps/triples/views/TripleExplanationView.java @@ -15,6 +15,7 @@ import com.antsapps.triples.R; import com.antsapps.triples.backend.Card; import com.antsapps.triples.cardsview.CardDimensionsProvider; +import com.antsapps.triples.cardsview.CardView; import com.google.common.collect.ImmutableList; import java.util.LinkedHashSet; import java.util.List; @@ -24,6 +25,7 @@ public class TripleExplanationView extends FrameLayout { private Set mCards = new LinkedHashSet<>(); private SingleScaledCardView[] mCardViews = new SingleScaledCardView[3]; + private LinearLayout[] mCardRows = new LinearLayout[3]; private PropertyIllustrationView[][] mPropertyIcons = new PropertyIllustrationView[3][4]; private TextView[] mConclusionTexts = new TextView[4]; private ImageView[] mConclusionTicks = new ImageView[4]; @@ -70,17 +72,13 @@ public TripleExplanationView(@NonNull Context context, @Nullable AttributeSet at // Card Rows for (int i = 0; i < 3; i++) { - LinearLayout cardRow = createRow(context); - cardRow.setGravity(Gravity.CENTER_VERTICAL); - if (i > 0) { - LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) cardRow.getLayoutParams(); - params.topMargin = dpToPx(-13); - } + mCardRows[i] = createRow(context); + mCardRows[i].setGravity(Gravity.CENTER_VERTICAL); mCardViews[i] = new SingleScaledCardView(context); mCardViews[i].setLayoutParams( new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f)); - cardRow.addView(mCardViews[i]); + mCardRows[i].addView(mCardViews[i]); for (int j = 0; j < 4; j++) { mPropertyIcons[i][j] = new PropertyIllustrationView(context); @@ -88,9 +86,9 @@ public TripleExplanationView(@NonNull Context context, @Nullable AttributeSet at ((LinearLayout.LayoutParams) mPropertyIcons[i][j].getLayoutParams()).gravity = Gravity.CENTER_VERTICAL; mPropertyIcons[i][j].setPropertyType(mPropertyTypes[j]); - cardRow.addView(mPropertyIcons[i][j]); + mCardRows[i].addView(mPropertyIcons[i][j]); } - table.addView(cardRow); + table.addView(mCardRows[i]); } // Conclusion Row @@ -142,6 +140,49 @@ public TripleExplanationView(@NonNull Context context, @Nullable AttributeSet at setCards(new java.util.LinkedHashSet<>()); } + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + if (width > 0) { + updateMargins(width); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + private void updateMargins(int totalWidth) { + // totalWidth includes padding. The table itself is match_parent inside the layout, + // which has 4dp padding on all sides. + int padding = dpToPx(4); + int tableWidth = totalWidth - 2 * padding; + + // There are 5 columns in each row (1 for card, 4 for properties). + int cellWidth = tableWidth / 5; + // SingleScaledCardView matches its cell width. + int cardWidth = cellWidth; + int cardHeight = (int) (cardWidth * CardView.HEIGHT_OVER_WIDTH); + + // Horizontal displacement: 10% of card width, same as TripleStackView + int horizDisplacement = (int) (cardWidth * TripleStackView.STACK_HORIZ_DISPLACEMENT_PERCENT); + // Vertical displacement: 65% of card height, same as TripleStackView + int verticalDisplacement = (int) (cardHeight * TripleStackView.STACK_DISPLACEMENT_PERCENT); + int verticalOverlap = cardHeight - verticalDisplacement; + + for (int i = 0; i < 3; i++) { + LinearLayout.LayoutParams cardParams = + (LinearLayout.LayoutParams) mCardViews[i].getLayoutParams(); + cardParams.leftMargin = i * horizDisplacement; + cardParams.rightMargin = (2 - i) * horizDisplacement; + mCardViews[i].setLayoutParams(cardParams); + + if (i > 0) { + LinearLayout.LayoutParams rowParams = + (LinearLayout.LayoutParams) mCardRows[i].getLayoutParams(); + rowParams.topMargin = -verticalOverlap; + mCardRows[i].setLayoutParams(rowParams); + } + } + } + public void setNaturalCardDimensionsProvider(CardDimensionsProvider cardDimensionsProvider) { for (SingleScaledCardView cardView : mCardViews) { cardView.setNaturalCardDimensionsProvider(cardDimensionsProvider); diff --git a/app/src/main/java/com/antsapps/triples/views/TripleStackView.java b/app/src/main/java/com/antsapps/triples/views/TripleStackView.java index 6fc44ddb..e744c617 100644 --- a/app/src/main/java/com/antsapps/triples/views/TripleStackView.java +++ b/app/src/main/java/com/antsapps/triples/views/TripleStackView.java @@ -32,6 +32,7 @@ public class TripleStackView extends View { static final float STACK_DISPLACEMENT_PERCENT = 0.65f; + static final float STACK_HORIZ_DISPLACEMENT_PERCENT = 0.10f; private Set mTriple = null; private boolean mHighlighted = false; @@ -45,6 +46,7 @@ public class TripleStackView extends View { private int mCardWidth; private int mCardHeight; private int mStackDisplacement; + private int mStackHorizDisplacement; private int mPadding; public TripleStackView(Context context) { @@ -85,8 +87,9 @@ public void getOutline(View view, android.graphics.Outline outline) { float d = view.getResources().getDisplayMetrics().density; float cornerRadius = 4 * d * getScaleFactor(); int totalHeight = mCardHeight + 2 * mStackDisplacement; + int totalWidth = mCardWidth + 2 * mStackHorizDisplacement; outline.setRoundRect( - mPadding, mPadding, mPadding + mCardWidth, mPadding + totalHeight, cornerRadius); + mPadding, mPadding, mPadding + totalWidth, mPadding + totalHeight, cornerRadius); } }); setClipToOutline(true); @@ -139,9 +142,10 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } private void updateDimensions(int width) { - mCardWidth = width - 2 * mPadding; + mCardWidth = (int) ((width - 2 * mPadding) / (1 + 2 * STACK_HORIZ_DISPLACEMENT_PERCENT)); mCardHeight = (int) (mCardWidth * CardView.HEIGHT_OVER_WIDTH); mStackDisplacement = (int) (mCardHeight * STACK_DISPLACEMENT_PERCENT); + mStackHorizDisplacement = (int) (mCardWidth * STACK_HORIZ_DISPLACEMENT_PERCENT); } @Override @@ -181,7 +185,7 @@ private void drawTripleStack(Canvas canvas) { mCardViewCache.put(card, cardView); } canvas.save(); - canvas.translate(mPadding, mPadding + i * mStackDisplacement); + canvas.translate(mPadding + i * mStackHorizDisplacement, mPadding + i * mStackDisplacement); canvas.scale(scale, scale); cardView.drawCardContent(canvas, bounds); canvas.restore(); @@ -201,11 +205,12 @@ private void drawHighlightBorder(Canvas canvas) { float density = getContext().getResources().getDisplayMetrics().density; float inset = INSET_DP * density * getScaleFactor(); int totalHeight = mCardHeight + 2 * mStackDisplacement; + int totalWidth = mCardWidth + 2 * mStackHorizDisplacement; RectF rect = new RectF( mPadding + inset, mPadding + inset, - mPadding + mCardWidth - inset, + mPadding + totalWidth - inset, mPadding + totalHeight - inset); canvas.drawRoundRect(rect, 10, 10, mHighlightPaint); } @@ -214,11 +219,12 @@ private void drawPlaceholder(Canvas canvas) { float density = getContext().getResources().getDisplayMetrics().density; float inset = INSET_DP * density * getScaleFactor(); int totalHeight = mCardHeight + 2 * mStackDisplacement; + int totalWidth = mCardWidth + 2 * mStackHorizDisplacement; RectF rect = new RectF( mPadding + inset, mPadding + inset, - mPadding + mCardWidth - inset, + mPadding + totalWidth - inset, mPadding + totalHeight - inset); canvas.drawRoundRect(rect, 10, 10, mPlaceholderPaint); } @@ -234,7 +240,7 @@ public Map computeCardBoundsInWindow(Set triple) { List sorted = getSortedTriple(triple); for (int i = 0; i < sorted.size(); i++) { Card card = sorted.get(i); - int left = loc[0] + mPadding; + int left = loc[0] + mPadding + i * mStackHorizDisplacement; int top = loc[1] + mPadding + i * mStackDisplacement; cardBounds.put(card, new Rect(left, top, left + mCardWidth, top + mCardHeight)); } diff --git a/app/src/test/screenshots/arcade_game_dark.png b/app/src/test/screenshots/arcade_game_dark.png index ce9fab4a..61a9c4f4 100644 Binary files a/app/src/test/screenshots/arcade_game_dark.png and b/app/src/test/screenshots/arcade_game_dark.png differ diff --git a/app/src/test/screenshots/arcade_game_light.png b/app/src/test/screenshots/arcade_game_light.png index ca0f1c3b..d15634a5 100644 Binary files a/app/src/test/screenshots/arcade_game_light.png and b/app/src/test/screenshots/arcade_game_light.png differ diff --git a/app/src/test/screenshots/beginner_mode_dark.png b/app/src/test/screenshots/beginner_mode_dark.png index a46dba6d..7d252c73 100644 Binary files a/app/src/test/screenshots/beginner_mode_dark.png and b/app/src/test/screenshots/beginner_mode_dark.png differ diff --git a/app/src/test/screenshots/beginner_mode_light.png b/app/src/test/screenshots/beginner_mode_light.png index 6019613d..46eac5a6 100644 Binary files a/app/src/test/screenshots/beginner_mode_light.png and b/app/src/test/screenshots/beginner_mode_light.png differ diff --git a/app/src/test/screenshots/classic_game_analysis_dark.png b/app/src/test/screenshots/classic_game_analysis_dark.png index 83f8a68b..761d4372 100644 Binary files a/app/src/test/screenshots/classic_game_analysis_dark.png and b/app/src/test/screenshots/classic_game_analysis_dark.png differ diff --git a/app/src/test/screenshots/classic_game_analysis_light.png b/app/src/test/screenshots/classic_game_analysis_light.png index 4b83f5fb..61cbbde1 100644 Binary files a/app/src/test/screenshots/classic_game_analysis_light.png and b/app/src/test/screenshots/classic_game_analysis_light.png differ diff --git a/app/src/test/screenshots/classic_game_dark.png b/app/src/test/screenshots/classic_game_dark.png index ba448b39..6b7f843c 100644 Binary files a/app/src/test/screenshots/classic_game_dark.png and b/app/src/test/screenshots/classic_game_dark.png differ diff --git a/app/src/test/screenshots/classic_game_light.png b/app/src/test/screenshots/classic_game_light.png index 1725572d..dd11617c 100644 Binary files a/app/src/test/screenshots/classic_game_light.png and b/app/src/test/screenshots/classic_game_light.png differ diff --git a/app/src/test/screenshots/daily_game_dark.png b/app/src/test/screenshots/daily_game_dark.png index 11e8b1a5..f5a88f75 100644 Binary files a/app/src/test/screenshots/daily_game_dark.png and b/app/src/test/screenshots/daily_game_dark.png differ diff --git a/app/src/test/screenshots/daily_game_light.png b/app/src/test/screenshots/daily_game_light.png index 085b3ae8..fa21b24d 100644 Binary files a/app/src/test/screenshots/daily_game_light.png and b/app/src/test/screenshots/daily_game_light.png differ diff --git a/app/src/test/screenshots/help_dark.png b/app/src/test/screenshots/help_dark.png index 00b4aa44..ed3059b1 100644 Binary files a/app/src/test/screenshots/help_dark.png and b/app/src/test/screenshots/help_dark.png differ diff --git a/app/src/test/screenshots/help_light.png b/app/src/test/screenshots/help_light.png index 457a096d..552e1cea 100644 Binary files a/app/src/test/screenshots/help_light.png and b/app/src/test/screenshots/help_light.png differ diff --git a/app/src/test/screenshots/incorrect_triples_snackbar.png b/app/src/test/screenshots/incorrect_triples_snackbar.png index 29ee1304..cf9adab4 100644 Binary files a/app/src/test/screenshots/incorrect_triples_snackbar.png and b/app/src/test/screenshots/incorrect_triples_snackbar.png differ diff --git a/app/src/test/screenshots/main_dark.png b/app/src/test/screenshots/main_dark.png index eccf6da0..c38e4bfc 100644 Binary files a/app/src/test/screenshots/main_dark.png and b/app/src/test/screenshots/main_dark.png differ diff --git a/app/src/test/screenshots/main_light.png b/app/src/test/screenshots/main_light.png index 5dec11c2..ee8070b7 100644 Binary files a/app/src/test/screenshots/main_light.png and b/app/src/test/screenshots/main_light.png differ diff --git a/app/src/test/screenshots/settings_dark.png b/app/src/test/screenshots/settings_dark.png index ea16c956..d3b3e943 100644 Binary files a/app/src/test/screenshots/settings_dark.png and b/app/src/test/screenshots/settings_dark.png differ diff --git a/app/src/test/screenshots/settings_light.png b/app/src/test/screenshots/settings_light.png index fa007575..e39dbe65 100644 Binary files a/app/src/test/screenshots/settings_light.png and b/app/src/test/screenshots/settings_light.png differ diff --git a/app/src/test/screenshots/statistics_arcade_analysis_dark.png b/app/src/test/screenshots/statistics_arcade_analysis_dark.png index da6b3e60..4d029971 100644 Binary files a/app/src/test/screenshots/statistics_arcade_analysis_dark.png and b/app/src/test/screenshots/statistics_arcade_analysis_dark.png differ diff --git a/app/src/test/screenshots/statistics_arcade_analysis_light.png b/app/src/test/screenshots/statistics_arcade_analysis_light.png index d8c90a18..cb142a60 100644 Binary files a/app/src/test/screenshots/statistics_arcade_analysis_light.png and b/app/src/test/screenshots/statistics_arcade_analysis_light.png differ diff --git a/app/src/test/screenshots/statistics_arcade_dark.png b/app/src/test/screenshots/statistics_arcade_dark.png index dee3478d..9bfccc33 100644 Binary files a/app/src/test/screenshots/statistics_arcade_dark.png and b/app/src/test/screenshots/statistics_arcade_dark.png differ diff --git a/app/src/test/screenshots/statistics_arcade_light.png b/app/src/test/screenshots/statistics_arcade_light.png index 420aa81a..966c08b9 100644 Binary files a/app/src/test/screenshots/statistics_arcade_light.png and b/app/src/test/screenshots/statistics_arcade_light.png differ diff --git a/app/src/test/screenshots/statistics_classic_analysis_dark.png b/app/src/test/screenshots/statistics_classic_analysis_dark.png index 6048c6f2..e16caeb5 100644 Binary files a/app/src/test/screenshots/statistics_classic_analysis_dark.png and b/app/src/test/screenshots/statistics_classic_analysis_dark.png differ diff --git a/app/src/test/screenshots/statistics_classic_analysis_light.png b/app/src/test/screenshots/statistics_classic_analysis_light.png index 5c43bc2c..b7e1a840 100644 Binary files a/app/src/test/screenshots/statistics_classic_analysis_light.png and b/app/src/test/screenshots/statistics_classic_analysis_light.png differ diff --git a/app/src/test/screenshots/statistics_classic_dark.png b/app/src/test/screenshots/statistics_classic_dark.png index 47563504..b4070a3f 100644 Binary files a/app/src/test/screenshots/statistics_classic_dark.png and b/app/src/test/screenshots/statistics_classic_dark.png differ diff --git a/app/src/test/screenshots/statistics_classic_light.png b/app/src/test/screenshots/statistics_classic_light.png index 300e788c..271ddcff 100644 Binary files a/app/src/test/screenshots/statistics_classic_light.png and b/app/src/test/screenshots/statistics_classic_light.png differ diff --git a/app/src/test/screenshots/statistics_classic_partial_analysis_dark.png b/app/src/test/screenshots/statistics_classic_partial_analysis_dark.png index d5f82546..0cdff7c0 100644 Binary files a/app/src/test/screenshots/statistics_classic_partial_analysis_dark.png and b/app/src/test/screenshots/statistics_classic_partial_analysis_dark.png differ diff --git a/app/src/test/screenshots/statistics_classic_partial_analysis_light.png b/app/src/test/screenshots/statistics_classic_partial_analysis_light.png index a73f71a4..a9956b27 100644 Binary files a/app/src/test/screenshots/statistics_classic_partial_analysis_light.png and b/app/src/test/screenshots/statistics_classic_partial_analysis_light.png differ diff --git a/app/src/test/screenshots/view_board_dark.png b/app/src/test/screenshots/view_board_dark.png index d2f41029..2c33b3a2 100644 Binary files a/app/src/test/screenshots/view_board_dark.png and b/app/src/test/screenshots/view_board_dark.png differ diff --git a/app/src/test/screenshots/view_board_light.png b/app/src/test/screenshots/view_board_light.png index 75311ea5..0d3d9783 100644 Binary files a/app/src/test/screenshots/view_board_light.png and b/app/src/test/screenshots/view_board_light.png differ diff --git a/app/src/test/screenshots/zen_game_dark.png b/app/src/test/screenshots/zen_game_dark.png index 3929741f..c40edaec 100644 Binary files a/app/src/test/screenshots/zen_game_dark.png and b/app/src/test/screenshots/zen_game_dark.png differ diff --git a/app/src/test/screenshots/zen_game_hint_dark.png b/app/src/test/screenshots/zen_game_hint_dark.png index 4b8d7299..e5104537 100644 Binary files a/app/src/test/screenshots/zen_game_hint_dark.png and b/app/src/test/screenshots/zen_game_hint_dark.png differ diff --git a/app/src/test/screenshots/zen_game_hint_light.png b/app/src/test/screenshots/zen_game_hint_light.png index a9842457..09e2337e 100644 Binary files a/app/src/test/screenshots/zen_game_hint_light.png and b/app/src/test/screenshots/zen_game_hint_light.png differ diff --git a/app/src/test/screenshots/zen_game_hint_selected_dark.png b/app/src/test/screenshots/zen_game_hint_selected_dark.png index 2345b3de..34d104f1 100644 Binary files a/app/src/test/screenshots/zen_game_hint_selected_dark.png and b/app/src/test/screenshots/zen_game_hint_selected_dark.png differ diff --git a/app/src/test/screenshots/zen_game_hint_selected_light.png b/app/src/test/screenshots/zen_game_hint_selected_light.png index 171e342e..68a0500c 100644 Binary files a/app/src/test/screenshots/zen_game_hint_selected_light.png and b/app/src/test/screenshots/zen_game_hint_selected_light.png differ diff --git a/app/src/test/screenshots/zen_game_light.png b/app/src/test/screenshots/zen_game_light.png index 4216c8ed..29b01bfb 100644 Binary files a/app/src/test/screenshots/zen_game_light.png and b/app/src/test/screenshots/zen_game_light.png differ