📄 sizerequirements.java
字号:
* @param offsets will hold the offset values for each component * @param spans will hold the span values for each component * @param forward whether the components should be placed in the forward * direction (left-right or top-bottom) or reverse direction * (right-left or bottom-top) */ public static void calculateTiledPositions(int allocated, SizeRequirements total, SizeRequirements[] children, int[] offsets, int[] spans, boolean forward) { int span = 0; if (forward) { int offset = 0; for (int i = 0; i < children.length; i++) { offsets[i] = offset; spans[i] = children[i].preferred; span += spans[i]; offset += children[i].preferred; } } else { int offset = allocated; for (int i = 0; i < children.length; i++) { offset -= children[i].preferred; offsets[i] = offset; span += spans[i]; spans[i] = children[i].preferred; } } // Adjust spans so that we exactly fill the allocated region. If if (span > allocated) adjustSmaller(allocated, children, spans, span); else if (span < allocated) adjustGreater(allocated, children, spans, span); // Adjust offsets. if (forward) { int offset = 0; for (int i = 0; i < children.length; i++) { offsets[i] = offset; offset += spans[i]; } } else { int offset = allocated; for (int i = 0; i < children.length; i++) { offset -= spans[i]; offsets[i] = offset; } } } private static void adjustSmaller(int allocated, SizeRequirements[] children, int[] spans, int span) { // Sum up (prefSize - minSize) over all children int sumDelta = 0; for (int i = 0; i < children.length; i++) sumDelta += children[i].preferred - children[i].minimum; // If we have sumDelta == 0, then all components have prefSize == maxSize // and we can't do anything about it. if (sumDelta == 0) return; // Adjust all sizes according to their preferred and minimum sizes. for (int i = 0; i < children.length; i++) { double factor = ((double) (children[i].preferred - children[i].minimum)) / ((double) sumDelta); // In case we have a sumDelta of 0, the factor should also be 0. if (Double.isNaN(factor)) factor = 0; spans[i] -= factor * (span - allocated); } } private static void adjustGreater(int allocated, SizeRequirements[] children, int[] spans, int span) { // Sum up (maxSize - prefSize) over all children long sumDelta = 0; for (int i = 0; i < children.length; i++) { sumDelta += children[i].maximum - children[i].preferred; } // If we have sumDelta == 0, then all components have prefSize == maxSize // and we can't do anything about it. if (sumDelta == 0) return; // Adjust all sizes according to their preferred and minimum sizes. for (int i = 0; i < children.length; i++) { double factor = ((double) (children[i].maximum - children[i].preferred)) / ((double) sumDelta); spans[i] += factor * (allocated - span); } } /** * Calculate the offsets and spans of the components, when they should * be placed end-to-end. * * You must specify the amount of allocated space in * <code>allocated</code>, the total size requirements of the set of * components in <code>total</code> (this can be calculated using * {@link #getTiledSizeRequirements} and the size requirements of the * components in <code>children</code>. * * The calculated offset and span values for each component are then * stored in the arrays <code>offsets</code> and <code>spans</code>. * * The components are tiled in the forward direction, beginning with * an offset of 0. * * @param allocated the amount of allocated space * @param total the total size requirements of the components * @param children the size requirement of each component * @param offsets will hold the offset values for each component * @param spans will hold the span values for each component */ public static void calculateAlignedPositions(int allocated, SizeRequirements total, SizeRequirements[] children, int[] offsets, int[] spans) { calculateAlignedPositions(allocated, total, children, offsets, spans, true); } /** * Calculate the offsets and spans of the components, when they should * be placed end-to-end. * * You must specify the amount of allocated space in * <code>allocated</code>, the total size requirements of the set of * components in <code>total</code> (this can be calculated using * {@link #getTiledSizeRequirements} and the size requirements of the * components in <code>children</code>. * * The calculated offset and span values for each component are then * stored in the arrays <code>offsets</code> and <code>spans</code>. * * Depending on the value of <code>forward</code> the components are * placed in the forward direction (left-right or top-bottom), where * the offsets begin with 0, or in the reverse direction * (right-left or bottom-top). * * @param allocated the amount of allocated space * @param total the total size requirements of the components * @param children the size requirement of each component * @param spans will hold the span values for each component * @param forward whether the components should be placed in the forward * direction (left-right or top-bottom) or reverse direction * (right-left or bottom-top) */ public static void calculateAlignedPositions(int allocated, SizeRequirements total, SizeRequirements[] children, int[] offset, int[] spans, boolean forward) { // First we compute the position of the baseline. float baseline = allocated * total.alignment; // Now we can layout the components along the baseline. for (int i = 0; i < children.length; i++) { float align = children[i].alignment; // Try to fit the component into the available space. int[] spanAndOffset = new int[2]; if (align < .5F || baseline == 0) adjustFromRight(children[i], baseline, allocated, spanAndOffset); else adjustFromLeft(children[i], baseline, allocated, spanAndOffset); spans[i] = spanAndOffset[0]; offset[i] = spanAndOffset[1]; } } /** * Adjusts the span and offset of a component for the aligned layout. * * @param reqs * @param baseline * @param allocated * @param spanAndOffset */ private static void adjustFromRight(SizeRequirements reqs, float baseline, int allocated, int[] spanAndOffset) { float right = allocated - baseline; // If the resulting span exceeds the maximum of the component, then adjust // accordingly. float maxRight = ((float) reqs.maximum) * (1.F - reqs.alignment); if (right / (1.F - reqs.alignment) > reqs.maximum) right = maxRight; // If we have not enough space on the left side, then adjust accordingly. if (right / (1.F - reqs.alignment) * reqs.alignment > allocated - baseline) right = ((float) (allocated - baseline)) / reqs.alignment * (1.F - reqs.alignment); spanAndOffset[0] = (int) (right / (1.F - reqs.alignment)); spanAndOffset[1] = (int) (baseline - spanAndOffset[0] * reqs.alignment); } /** * Adjusts the span and offset of a component for the aligned layout. * * @param reqs * @param baseline * @param allocated * @param spanAndOffset */ private static void adjustFromLeft(SizeRequirements reqs, float baseline, int allocated, int[] spanAndOffset) { float left = baseline; // If the resulting span exceeds the maximum of the component, then adjust // accordingly. float maxLeft = ((float) reqs.maximum) * reqs.alignment; if (left / reqs.alignment > reqs.maximum) left = maxLeft; // If we have not enough space on the right side, then adjust accordingly. if (left / reqs.alignment * (1.F - reqs.alignment) > allocated - baseline) left = ((float) (allocated - baseline)) / (1.F - reqs.alignment) * reqs.alignment; spanAndOffset[0] = (int) (left / reqs.alignment); spanAndOffset[1] = (int) (baseline - spanAndOffset[0] * reqs.alignment); } /** * Returns an array of new preferred sizes for the children based on * <code>delta</code>. <code>delta</code> specifies a change in the * allocated space. The sizes of the children will be shortened or * lengthened to accomodate the new allocation. * * @param delta the change of the size of the total allocation for * the components * @param children the size requirements of each component * * @return the new preferred sizes for each component */ public static int[] adjustSizes(int delta, SizeRequirements[] children) { return null; // TODO }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -