@oiiai/oiiai-taro-react
Version:
OiiaiUI is a miniprogram ui library for TaroJS
64 lines (54 loc) • 2.94 kB
text/typescript
export const calculateInnerRadius = (outerRadius: number, padding: {
top: number;
right: number;
bottom: number;
left: number;
}): number => {
// 计算水平方向上两边剩余空间的最小值
const horizontalMinSpace = Math.min(outerRadius - padding.left, outerRadius - padding.right);
// 计算垂直方向上两边剩余空间的最小值
const verticalMinSpace = Math.min(outerRadius - padding.top, outerRadius - padding.bottom);
// 取水平和垂直方向剩余空间最小值中的较小值作为初步的内圆角半径候选值
let candidateRadius = Math.min(horizontalMinSpace, verticalMinSpace);
// 考虑特殊情况,如果内边距设置使得某个方向剩余空间过小甚至为负,进行适当调整
if (candidateRadius < 0) {
candidateRadius = 0;
} else if (candidateRadius === 0 && (horizontalMinSpace > 0 || verticalMinSpace > 0)) {
// 如果有一个方向还有剩余空间,取那个方向的剩余空间作为内圆角半径(尽量保证有圆角效果)
candidateRadius = Math.max(horizontalMinSpace, verticalMinSpace);
}
// 进一步检查,避免出现内圆角半径与外圆角半径相差过小导致视觉上不和谐的情况
// 这里假设内圆角半径至少要比外圆角半径小一定比例(比如1/3,可根据实际视觉效果调整)才比较合适
const minProperRatio = 1 / 3;
const properMinRadius = outerRadius * minProperRatio;
if (candidateRadius > outerRadius - properMinRadius) {
candidateRadius = outerRadius - properMinRadius;
}
return candidateRadius;
}
export const calculateOuterRadius = (innerRadius: number, padding: {
top: number;
right: number;
bottom: number;
left: number;
}): number => {
let outerRadius = innerRadius;
// 首先考虑最小比例调整的逆向
const minProperRatio = 1 / 3;
outerRadius = innerRadius + innerRadius / (minProperRatio - 1);
// 考虑特殊情况的逆向
const horizontalMinSpace = Math.min(outerRadius - padding.left, outerRadius - padding.right);
const verticalMinSpace = Math.min(outerRadius - padding.top, outerRadius - padding.bottom);
let candidateRadius = Math.min(horizontalMinSpace, verticalMinSpace);
if (candidateRadius < 0) {
// 如果 candidateRadius 小于 0,需要调整 outerRadius 以满足条件
let adjustedOuterRadius = Math.max(padding.left, padding.right);
adjustedOuterRadius = Math.max(adjustedOuterRadius, padding.top, padding.bottom);
outerRadius = innerRadius + adjustedOuterRadius;
} else if (candidateRadius === 0 && (horizontalMinSpace > 0 || verticalMinSpace > 0)) {
// 如果有一个方向还有剩余空间,需要调整 outerRadius 以满足条件
let adjustedOuterRadius = Math.max(horizontalMinSpace, verticalMinSpace);
outerRadius = innerRadius + adjustedOuterRadius;
}
return outerRadius;
}