@OnMeasure static void onMeasure( ComponentContext c, ComponentLayout layout, int widthSpec, int heightSpec, Size size) { if (SizeSpec.getMode(widthSpec) == SizeSpec.UNSPECIFIED && SizeSpec.getMode(heightSpec) == SizeSpec.UNSPECIFIED) { size.width = DEFAULT_SIZE; size.height = DEFAULT_SIZE; } else { MeasureUtils.measureWithEqualDimens(widthSpec, heightSpec, size); } }
/** * Resolve a size spec given a preferred size. * * @param sizeSpec The spec to resolve. * @param preferredSize The preferred size. * @return The resolved size. */ public static int resolveSize(int sizeSpec, int preferredSize) { switch (SizeSpec.getMode(sizeSpec)) { case EXACTLY: return SizeSpec.getSize(sizeSpec); case AT_MOST: return Math.min(SizeSpec.getSize(sizeSpec), preferredSize); case UNSPECIFIED: return preferredSize; default: throw new IllegalStateException("Unexpected size mode: " + SizeSpec.getMode(sizeSpec)); } }
private static int getResultSizePxWithSpecAndDesiredPx(int spec, int desiredSize) { final int mode = SizeSpec.getMode(spec); switch (mode) { case SizeSpec.UNSPECIFIED: return desiredSize; case SizeSpec.AT_MOST: return Math.min(SizeSpec.getSize(spec), desiredSize); case SizeSpec.EXACTLY: return SizeSpec.getSize(spec); default: throw new IllegalStateException("Unexpected size spec mode"); } }
public static int getViewMeasureSpec(int sizeSpec) { switch (getMode(sizeSpec)) { case SizeSpec.EXACTLY: return MeasureSpec.makeMeasureSpec(getSize(sizeSpec), MeasureSpec.EXACTLY); case SizeSpec.AT_MOST: return MeasureSpec.makeMeasureSpec(getSize(sizeSpec), MeasureSpec.AT_MOST); case SizeSpec.UNSPECIFIED: return MeasureSpec.makeMeasureSpec(getSize(sizeSpec), MeasureSpec.UNSPECIFIED); default: throw new IllegalStateException("Unexpected size spec mode"); } }
public static boolean isMeasureSpecCompatible( int oldSizeSpec, int sizeSpec, int oldMeasuredSize) { final int newSpecMode = SizeSpec.getMode(sizeSpec); final int newSpecSize = SizeSpec.getSize(sizeSpec); final int oldSpecMode = SizeSpec.getMode(oldSizeSpec); final int oldSpecSize = SizeSpec.getSize(oldSizeSpec); return oldSizeSpec == sizeSpec || (oldSpecMode == UNSPECIFIED && newSpecMode == UNSPECIFIED) || newSizeIsExactAndMatchesOldMeasuredSize(newSpecMode, newSpecSize, oldMeasuredSize) || oldSizeIsUnspecifiedAndStillFits(oldSpecMode, newSpecMode, newSpecSize, oldMeasuredSize) || newMeasureSizeIsStricterAndStillValid( oldSpecMode, newSpecMode, oldSpecSize, newSpecSize, oldMeasuredSize); } }
void setStyleWidthFromSpec(int widthSpec) { switch (SizeSpec.getMode(widthSpec)) { case SizeSpec.UNSPECIFIED: mYogaNode.setWidth(YogaConstants.UNDEFINED); break; case SizeSpec.AT_MOST: mYogaNode.setMaxWidth(SizeSpec.getSize(widthSpec)); break; case SizeSpec.EXACTLY: mYogaNode.setWidth(SizeSpec.getSize(widthSpec)); break; } }
void setStyleHeightFromSpec(int heightSpec) { switch (SizeSpec.getMode(heightSpec)) { case SizeSpec.UNSPECIFIED: mYogaNode.setHeight(YogaConstants.UNDEFINED); break; case SizeSpec.AT_MOST: mYogaNode.setMaxHeight(SizeSpec.getSize(heightSpec)); break; case SizeSpec.EXACTLY: mYogaNode.setHeight(SizeSpec.getSize(heightSpec)); break; } }
@Test public void testGetChildMeasureSpecVertical() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo((200 / 3) * 2); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecHorizontal() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo((200 / 3) * 2); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); }
@Test public void testFullSpanChildWidthSpec() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo(200); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testFullSpanChildHeightSpec() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo(200); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecHorizontal() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(1); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo((200 / 3) * 1); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); }
@Test public void testGetChildMeasureSpecOverride() { final GridLayoutInfo gridLayoutInfo = createGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); when(renderInfo.getCustomAttribute(GridLayoutInfo.OVERRIDE_SIZE)).thenReturn(20); final int heightSpec = gridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = gridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo(20); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecOverrideHorizontal() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); when(renderInfo.getCustomAttribute(StaggeredGridLayoutInfo.OVERRIDE_SIZE)).thenReturn(20); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo(20); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecVerticalWithFullSpan() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo((200 / 3) * 3); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecHorizontalWithFullSpan() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(HORIZONTAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.isFullSpan()).thenReturn(true); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(heightSpec)).isEqualTo((200 / 3) * 3); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(EXACTLY); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(UNSPECIFIED); }
@Test public void testGetChildMeasureSpecOverrideVertical() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(2); when(renderInfo.getCustomAttribute(StaggeredGridLayoutInfo.OVERRIDE_SIZE)).thenReturn(20); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo(20); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void testGetChildMeasureSpecVertical() { final StaggeredGridLayoutInfo staggeredGridLayoutInfo = createStaggeredGridLayoutInfo(VERTICAL, 3); final int sizeSpec = SizeSpec.makeSizeSpec(200, EXACTLY); final RenderInfo renderInfo = mock(RenderInfo.class); when(renderInfo.getSpanSize()).thenReturn(1); final int heightSpec = staggeredGridLayoutInfo.getChildHeightSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getMode(heightSpec)).isEqualTo(UNSPECIFIED); final int widthSpec = staggeredGridLayoutInfo.getChildWidthSpec(sizeSpec, renderInfo); assertThat(SizeSpec.getSize(widthSpec)).isEqualTo((200 / 3) * 1); assertThat(SizeSpec.getMode(widthSpec)).isEqualTo(EXACTLY); }
@Test public void tesLastConstraints() { final Component component = TestDrawableComponent.create(mContext) .build(); InternalNode node = createInternalNodeForMeasurableComponent(component); DiffNode diffNode = new DiffNode(); diffNode.setLastWidthSpec(makeSizeSpec(10, SizeSpec.EXACTLY)); diffNode.setLastHeightSpec(makeSizeSpec(5, SizeSpec.EXACTLY)); diffNode.setLastMeasuredWidth(10f); diffNode.setLastMeasuredHeight(5f); diffNode.setComponent(component); node.setCachedMeasuresValid(true); node.setDiffNode(diffNode); long output = measureInternalNode(node, 10f, 5f); assertThat(getHeight(output) == (int) diffNode.getLastMeasuredHeight()).isTrue(); assertThat(getWidth(output) == (int) diffNode.getLastMeasuredWidth()).isTrue(); int lastWidthSpec = node.getLastWidthSpec(); int lastHeightSpec = node.getLastHeightSpec(); assertThat(getMode(lastWidthSpec) == SizeSpec.EXACTLY).isTrue(); assertThat(getMode(lastHeightSpec) == SizeSpec.EXACTLY).isTrue(); assertThat(getSize(lastWidthSpec) == 10).isTrue(); assertThat(getSize(lastHeightSpec) == 5).isTrue(); }