当前位置: 首页> 财经> 产业 > 香港特别行政区的面积_建造师人才网_百度交易平台官网_珠海百度关键字优化

香港特别行政区的面积_建造师人才网_百度交易平台官网_珠海百度关键字优化

时间:2025/7/15 0:20:07来源:https://blog.csdn.net/qq_33681891/article/details/146300805 浏览次数:0次
香港特别行政区的面积_建造师人才网_百度交易平台官网_珠海百度关键字优化

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

HarmonyOS NEXT 图片约束处理教程:深入理解Constrain

文章目录

  • HarmonyOS NEXT 图片约束处理教程:深入理解Constrain
    • 1. 图片约束基础
      • 1.1 核心概念
      • 1.2 图片适配类型定义
    • 2. 偏移计算实现
      • 2.1 最大偏移量计算
      • 2.2 偏移约束实现
    • 3. 图片切换判断
      • 3.1 切换条件判断
      • 3.2 参数说明
    • 4. 图片尺寸处理
      • 4.1 尺寸获取函数
      • 4.2 旋转处理
    • 5. 约束动画实现
      • 5.1 约束和动画函数
      • 5.2 使用示例
    • 6. 最佳实践
      • 6.1 性能优化
      • 6.2 错误处理

1. 图片约束基础

1.1 核心概念

概念说明应用场景
图片适配类型定义图片如何适应容器图片展示方式
偏移约束限制图片移动范围拖拽和缩放
边界检测判断是否超出显示范围图片浏览

1.2 图片适配类型定义

export enum ImageFitType {TYPE_WIDTH = 'width',TYPE_HEIGHT = 'height',TYPE_DEFAULT = 'default'
}

2. 偏移计算实现

2.1 最大偏移量计算

export function getMaxAllowedOffset(winSize: number,imageSize: number,scale: number
) {const maxNum = Math.max(imageSize * scale, winSize);const minNum = Math.min(imageSize * scale, winSize);return (maxNum - minNum) / 2;
}

2.2 偏移约束实现

function constrainOffset(offset: number,winSize: number,imageSize: number,scale: number
): number {let maxAllowedOffset = getMaxAllowedOffset(winSize, imageSize, scale);return Math.min(Math.max(offset, -maxAllowedOffset), maxAllowedOffset);
}

3. 图片切换判断

3.1 切换条件判断

function isToggle(offset: number,winSize: number,imageSize: number,scale: number,TogglePercent: number
): boolean {let maxAllowedOffset = getMaxAllowedOffset(winSize, imageSize, scale);const deviation = Math.abs(offset) - maxAllowedOffset;const switchThreshold = winSize * TogglePercent;return deviation > switchThreshold;
}

3.2 参数说明

参数说明用途
offset当前偏移量记录当前位置
winSize窗口大小确定显示范围
imageSize图片大小计算实际尺寸
scale缩放比例处理缩放效果
TogglePercent切换阈值控制切换灵敏度

4. 图片尺寸处理

4.1 尺寸获取函数

export function getImgSize(imageSize: image.Size,rotate: number,dimensionWH: ImageFitType.TYPE_WIDTH | ImageFitType.TYPE_HEIGHT
): number {const isStandardRotation = [90, 270].includes(Math.abs(rotate % 360));const Key = isStandardRotation ? (dimensionWH == ImageFitType.TYPE_WIDTH ? ImageFitType.TYPE_HEIGHT : ImageFitType.TYPE_WIDTH) :dimensionWH;return imageSize[Key];
}

4.2 旋转处理

  1. 标准旋转判断
const isStandardRotation = [90, 270].includes(Math.abs(rotate % 360));
  1. 维度切换
const Key = isStandardRotation ? (dimensionWH == ImageFitType.TYPE_WIDTH ? ImageFitType.TYPE_HEIGHT : ImageFitType.TYPE_WIDTH) :dimensionWH;

5. 约束动画实现

5.1 约束和动画函数

export function constrainOffsetAndAnimation(info: ConstrainOffsetAndAnimationType
): [boolean, boolean] {if (info.dimensionWH === ImageFitType.TYPE_DEFAULT) {return [false, false];}const WIN_SIZE = windowSizeManager.get();const IMG_SIZE = getImgSize(info.imageDefaultSize,info.rotate,info.dimensionWH);// 获取当前偏移量let currentOffset = info.imageOffsetInfo[`last${info.dimensionWH === ImageFitType.TYPE_WIDTH ? 'X' : 'Y'}`];// 处理列表偏移if (info.dimensionWH === (info.listDirection === Axis.Horizontal ? ImageFitType.TYPE_WIDTH : ImageFitType.TYPE_HEIGHT)) {currentOffset += info.imageListOffset;}// 计算约束后的偏移量const CLAMPED_OFFSET = constrainOffset(currentOffset,WIN_SIZE[info.dimensionWH],IMG_SIZE,info.scaleValue);// 处理偏移量变化if (CLAMPED_OFFSET !== currentOffset) {let updateFn = () => {info.imageOffsetInfo[`current${info.dimensionWH == ImageFitType.TYPE_WIDTH ? 'X' : 'Y'}`] = CLAMPED_OFFSET;info.imageOffsetInfo.stash();};runWithAnimation(updateFn);// 检查是否需要切换图片if (isToggle(currentOffset,WIN_SIZE[info.dimensionWH],IMG_SIZE,info.scaleValue,info.TogglePercent)) {const BOL = currentOffset >= 0;return [BOL, !BOL];}}return [false, false];
}

5.2 使用示例

// 处理图片约束和动画
const [leftExceeded, rightExceeded] = constrainOffsetAndAnimation({dimensionWH: ImageFitType.TYPE_WIDTH,imageDefaultSize: imageSize,imageOffsetInfo: offsetModel,scaleValue: scale,rotate: rotation,TogglePercent: 0.2,imageListOffset: listOffset,listDirection: Axis.Horizontal
});// 根据结果处理图片切换
if (leftExceeded) {// 切换到上一张switchToPrevious();
} else if (rightExceeded) {// 切换到下一张switchToNext();
}

6. 最佳实践

6.1 性能优化

  1. 缓存计算结果
const maxOffset = getMaxAllowedOffset(winSize, imageSize, scale);
// 多次使用maxOffset而不是重复计算
  1. 避免频繁更新
// 使用防抖处理频繁的约束计算
const debouncedConstrain = debounce((info) => {constrainOffsetAndAnimation(info);
}, 16);

6.2 错误处理

function safeConstrainOffset(info: ConstrainOffsetAndAnimationType) {try {return constrainOffsetAndAnimation(info);} catch (error) {console.error('Constrain calculation failed:', error);return [false, false];}
}

通过合理使用图片约束处理,可以实现流畅的图片浏览体验。在实际开发中,要注意性能优化和边界情况处理,确保图片操作的准确性和流畅性。

关键字:香港特别行政区的面积_建造师人才网_百度交易平台官网_珠海百度关键字优化

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: