- Creator 版本: 3.8
论坛里有个适配正方形尺寸的,不符合个人需求,改造成适配任意矩形。
只能在编辑器中修改,直接挂载到图片节点即可。需要在代码中动态修改的话自己传入节点改造。
代码
import { _decorator, Component, Node, Size, UITransform } from 'cc';
const { ccclass, property } = _decorator;
/**
* 图片按原比例适配目标尺寸, author: trackway
*/
@ccclass('ImageAdapter')
export class ImageAdapter extends Component {
@property(Size)// 这里不使用装饰器的话数值会自动变回0
private _adaptSize: Size = new Size(200, 200); // 默认目标尺寸
@property({tooltip: '适配尺寸'})
public set adaptSize(value:Size){
this._adaptSize = value;
this.onSizeChanged();
}
public get adaptSize(){
return this._adaptSize;
}
@property(CCBoolean)
public _alwaysScale: boolean = true; // 默认为true
@property({tooltip: '是否总是缩放节点以适应目标尺寸\ntrue: 总是缩放以适应目标尺寸\nfalse: 仅当节点原始尺寸超出目标尺寸时才缩小以适应,否则保持原始大小'})
public set alwaysScale(value: boolean) {
this._alwaysScale = value;
this.onSizeChanged();
}
public get alwaysScale() {
return this._alwaysScale;
}
protected onLoad() {
this.node.on(Node.EventType.SIZE_CHANGED, this.onSizeChanged, this);
this.onSizeChanged();
}
/**当尺寸变化时,重置node节点大小 */
onSizeChanged() {
let size = this.node.getComponent(UITransform).contentSize;
let originalAspectRatio = size.width / size.height;//计算节点的原始宽高比
let targetAspectRatio = this.adaptSize.width / this.adaptSize.height;//计算目标尺寸的宽高比
let scale = 1.0;// 最终应用到节点的缩放值
if (originalAspectRatio > targetAspectRatio) {
// 节点的原始形状比目标尺寸更“扁平”,以宽度为基准
scale = this.adaptSize.width / size.width;
} else {
// 节点的原始形状比目标尺寸更“瘦高”,或宽高比相同,以高度为基准
scale = this.adaptSize.height / size.height;
}
if (!this.alwaysScale) {// 如果不总是缩放,则检查节点的原始尺寸是否超出了目标尺寸
if (size.width <= this.adaptSize.width && size.height <= this.adaptSize.height) {
scale = 1.0; // 如果节点的原始尺寸小于或等于目标尺寸,则不进行缩放,保持原始大小
}
}
this.node.setScale(scale, scale);
}
}