九宫缩放scale9Grid

本文详细介绍了Flash中九宫格缩放(scale9Grid)的工作原理及使用限制,包括对不同对象的有效性和无效情况,并提供了示例代码。此外,还探讨了在Flex中的应用方法。

一、API中关于九宫缩放scale9Grid的介绍

1、当定义flash.display.DisplayObjectscale9Grid:Rectangle属性时,该显示对象被分割到以scale9Grid矩形为基础的具有九个区域的网格中。网格的其它八个区域如下:矩形外的左上角、矩形上方的区域、矩形外的右上角、矩形左侧的区域、矩形右侧的区域、矩形外的左下角、矩形下方的区域、矩形外的右下角,可以认为中心区域(由矩形定义)之外的八个区域类似于在缩放时已应用特殊规则的图片帧。

2、在设置 scale9Grid 属性并缩放显示对象后,会正常缩放所有文本和渐变;但是,对于对象的其它类型,将应用以下规则:

正常缩放中心区域中的内容。

不缩放转角中的内容。

仅水平缩放顶部和底部区域中的内容。仅垂直缩放左侧和右侧区域中的内容。

拉伸所有填充(包括位图、视频和渐变)以适应其形状。

如果旋转显示对象,则所有后续缩放都是正常的(并会忽略 scale9Grid 属性)。

设置 scale9Grid 的常见用法是设置用作组件的显示对象,当缩放该组件时,其中的边缘区域保持相同的宽度。

3API中的例子源码Scale9GridExample.as

import flash.display.Shape;

import flash.display.GradientType;

import flash.display.SpreadMethod;

import flash.display.Sprite;

import flash.display.InterpolationMethod;

import flash.geom.Matrix;

import flash.geom.Rectangle;

import flash.utils.Timer;

import flash.events.TimerEvent;

 

public class Scale9GridExample extends Sprite

{

       private var square:Shape;

       public function Scale9GridExample()

       {

              initSquare();

       }

       private function initSquare():void {

              square = new Shape();

              square.graphics.lineStyle(20, 0xFFCC00);

              var gradientMatrix:Matrix = new Matrix();

              gradientMatrix.createGradientBox(15, 15, Math.PI, 10, 10);

              square.graphics.beginGradientFill(GradientType.RADIAL,

                     [0xffff00, 0x0000ff],

                     [100, 100],

                     [0, 0xFF],

                     gradientMatrix,

                     SpreadMethod.REFLECT,

                     InterpolationMethod.RGB,

                       0.9);

              square.graphics.drawRect(0, 0, 100, 100);

              var grid:Rectangle = new Rectangle(20, 20, 60, 60);

              square.scale9Grid = grid ;

              addChild(square);

              var tim:Timer = new Timer(100);

              tim.start();

              tim.addEventListener(TimerEvent.TIMER, scale);

       }

       private function scale(event:TimerEvent):void {

              var scaleFactor:Number = 1.01;

            square.scaleX *= scaleFactor;

            square.scaleY *= scaleFactor;

            if (square.scaleX > 2.0) {

                       scaleFactor = 0.99;

                  }

            if (square.scaleX < 1.0) {

                       scaleFactor = 1.01;

                  }

       }

}

二、哪些时候会无效

1、只对矢量图起作用,对图片无效。解决办法参考:

http://bbs.blueidea.com/viewthread.php?tid=2915069

2、对Shape对象使用scale9Grid,有效。但是如果用Shape.graphics.beginBitmapFill (new BitmapData());//仅用了一个BitmapData对象填充Shape对象后,无效!

3、对Sprite对象使用scale9Grid

1)仅对Sprite对象下的“图形元件”和“直接绘制的形状”有效。

2)对Sprite对象下的Sprite对象,无效!

3)对Sprite对象下的“图形元件”,如果该“图形元件”内仅包含另个Sprite对象,依然无效。

4、参考博客:scale9Grid – When it works and when it does not

http://www.ovidiudiac.ro/blog/2009/05/scale9grid-work-and-fail/

三、Flex中使用Embed标签

Embed(source="track.png",scaleGridTop="20",scaleGridLeft="7",scaleGridRight="9",scaleGridBottom="80");

四、创建一个具有九宫格功能的Bitmap

http://flex2.group.iteye.com/group/blog/513064

五、推荐http://bbs.9ria.com/thread-47414-1-1.html(第三个页面打不开,郁闷)

 

<think>好的,我现在需要解决用户在Unity引擎中遇到的九宫格拉伸问题,特别是关于UI Sprite Grid的设置。用户提到了参考引用中的代码示例,可能涉及到动态加载Sprite和资源管理。首先,我得回忆一下Unity的九宫格(9-slice)缩放功能是如何工作的。 九宫缩放允许图片在缩放时保持边角和边缘的比例,而中间部分进行拉伸,这对于UI元素非常有用,比如按钮、面板等,避免变形。在Unity中,这通常是通过Sprite Editor中的Border设置来实现的。用户可能的问题在于如何正确设置这些边框值,或者在动态加载Sprite时没有正确应用九宫格参数。 接下来,我需要检查用户提供的引用内容。引用中的代码展示了如何动态加载Sprite并应用到SpriteRenderer上,使用的是Resources.Load方法。但九宫格的设置可能需要在导入Sprite时设置Border,或者在代码中动态调整。然而,Unity的九宫格设置通常在Sprite Editor中静态设置,动态加载的Sprite如果已经预设了Border值,应该会自动应用。但如果用户没有正确设置,或者在动态加载后没有更新,可能导致九宫格失效。 可能的解决方案包括:确保在Sprite Editor中正确设置Border,将Sprite的Mesh Type设置为Full Rect,使用Image组件而非SpriteRenderer(因为UI元素通常使用Canvas和Image),以及检查是否在代码中覆盖了九宫格设置。此外,用户可能在使用旧版UI系统,需要注意UGUI和旧系统的区别。 需要分步骤说明,首先如何设置Sprite的九宫格参数,然后如何在UI中使用,最后如何处理动态加载的情况。同时要提醒常见的错误,比如Border值不正确导致拉伸异常,或者没有应用Preset等。另外,用户可能在动态加载时没有保留九宫格信息,可能需要检查资源导入设置或使用Sprite Atlas。 最后,生成的相关问题应该围绕九宫格的原理、动态加载时的注意事项、性能优化以及常见错误排查等方向。确保回答结构清晰,步骤明确,引用正确,并且符合用户的实际操作流程。</think>### Unity引擎中解决九宫格拉伸问题的步骤 #### 1. **理解九宫格原理** 九宫格(Sprite Grid)通过将图片划分为9个区域,保持四角不拉伸、边缘单向拉伸、中心双向拉伸。数学上可表示为: $$ \text{缩放结果} = \text{角保持} + \text{边缘线性拉伸} + \text{中心面拉伸} $$ #### 2. **配置Sprite参数** - 在Project窗口选择Sprite文件 - 打开Sprite Editor(需启用2D Sprite包) - 设置绿色边框值(Border),定义四个边缘的固定区域[^1] ```csharp // 动态加载时需确保sprite.border已预设 Sprite loadedSprite = Resources.Load<Sprite>("UI/Button"); Image img = GetComponent<Image>(); img.sprite = loadedSprite; ``` #### 3. **UI组件适配 - 使用`Image`组件而非`SpriteRenderer` - 设置Image Type为`Sliced` - 在Canvas Scaler中配置适配模式(推荐Scale With Screen Size) #### 4. **动态加载的特殊处理 当通过代码加载Sprite时,需确保: ```csharp Sprite[] sprites = Resources.LoadAll<Sprite>("Atlas"); Image img = GetComponent<Image>(); img.type = Image.Type.Sliced; // 必须显式设置 img.sprite = sprites.Find(s => s.border == new Vector4(10,10,10,10)); // 匹配预设边框 ``` #### 5. **常见问题排查表 | 现象 | 解决方案 | |------|----------| | 边缘模糊 | 检查纹理Wrap Mode是否为Clamp | | 拉伸失效 | 确认Image Type是Sliced而非Simple | | 动态加载无效 | 调用img.SetNativeSize()刷新 | | 边框错位 | 确保Sprite的Pivot与RectTransform对齐 | #### 6. **性能优化建议 - 使用Sprite Atlas减少Draw Call - 对频繁更新的UI启用`Maskable`属性 - 九宫格区域不宜过小(建议最小32x32像素)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值