| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- using UnityEngine;
- using UnityEngine.UI;
- [RequireComponent(typeof(RawImage))]
- public class MaintainAspectRatio : MonoBehaviour
- {
- //None: 不调整图片大小,使用原始大小。
- //FitInParent: 按比例缩放图片以适应固定尺寸的框。
- //EnvelopeParent: 按比例缩放图片以覆盖固定尺寸的框。
- public enum AspectMode
- {
- None,
- FitInParent,
- EnvelopeParent
- }
- public AspectMode aspectMode = AspectMode.None;
- private RawImage rawImage;
- private RectTransform parentRectTransform;
- void Start()
- {
- rawImage = GetComponent<RawImage>();
- parentRectTransform = transform.parent.GetComponent<RectTransform>();
- //AdjustSize();
- }
- void Update()
- {
- // 在每帧更新时检查并调整大小
- //AdjustSize();
- }
- public void AdjustSize()
- {
- if (parentRectTransform == null) return;
- if (rawImage.texture == null) return;
- Vector2 fixedSize = parentRectTransform.rect.size;
- float imageAspect = (float)rawImage.texture.width / rawImage.texture.height;
- float targetAspect = fixedSize.x / fixedSize.y;
- RectTransform rt = rawImage.GetComponent<RectTransform>();
- switch (aspectMode)
- {
- case AspectMode.FitInParent:
- if (imageAspect > targetAspect)
- {
- // 图片更宽
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, fixedSize.x);
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, fixedSize.x / imageAspect);
- }
- else
- {
- // 图片更高
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, fixedSize.y);
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, fixedSize.y * imageAspect);
- }
- break;
- case AspectMode.EnvelopeParent:
- if (imageAspect > targetAspect)
- {
- // 图片更宽
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, fixedSize.y);
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, fixedSize.y * imageAspect);
- }
- else
- {
- // 图片更高
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, fixedSize.x);
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, fixedSize.x / imageAspect);
- }
- break;
- case AspectMode.None:
- default:
- // 原始图片大小
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rawImage.texture.width);
- rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rawImage.texture.height);
- break;
- }
- }
- }
|