IOS类似9.png

图形用户界面中的图形有两种实现方式,一种是用代码画出来,比如Quartz 2D技术,狠一点有OpenGL ES,另一种则是使用图片。 
代码画的方式比较耗费程序员脑力,CPU或GPU; 图片则耗费磁盘空间,会增加app的体积.一般的app我们会偏重于使用图片来构建用户界面. 
设计师一般会使用PS来设计界面,所以在直接使用之前,有一个PSD到png的切图(Image Slicing)过程.下面是切图过程中可能要注意的几点. 

一.可重复元素

在用户界面的图形元素中,重复随处可见 ,所以我们利用好框架提供的接口, 以比较高的性价比创建用户界面。

1.Color Pattern

Color Pattern在Web设计中也经常会遇到比如网页的背景,甚至网络中可以找到专门收集各类可重复的纹理图案的站点,比如 http://subtlepatterns.com. 下面这是一个小图片模板


circles


UIColor *circleColorPattern = [UIColor colorWithPatternImage:
[UIImage imageNamed:@"circle_pattern.png"]];

这样便可以得到一个颜色模板,用这个颜色画或者填充某个区域的时候,模板图片会在指定的区域中进行平铺.比如把一个View的背景颜色设置成上面这个颜色,便会得到如下结果


circles_fill


2.resizableImage

除了整体平铺之外,很多时候我们希望某个图片的局部进行平铺,而其余部分则保持不变. 比如常见的按钮,聊天的气泡背景或者图片的阴影边框. 这里举个按钮的例子,一般情况下为了方便做按钮就直接切个按钮背景,如下图button-blue但是自己看,你会发现按钮中间大都数像素都是横向重复的,所以可以使用iOS的图片接口来使用体积更小的图片实现相同的效果. 首先使用PS的切图工具进行切图,下图中的切图逻辑是,左边切14像素(13像素加1像素,1像素为中间重复部分),右边切13像素.

Retina屏幕下一个单位对应着两个像素,这里的例子是非Retina下的情况,请注意


button-blue-slicing



切图后将左右合并,变成最终所需要的图片


button-blue-sliced


图片宽度为27像素宽,中间第14个像素为中间重复的部分.

UIImage *buttonBackgroundImage = [[UIImage imageNamed:@"button_bkg.png"] 
resizableImageWithCapInsets:UIEdgeInsetsMake(0,13,0,13)];
[button setBackgroundImage:buttonBackgroundImage 
forState:UIControlStateNormal];

resizableImageWithCapInsets:的参数是一个UIEdgeInsets的结构体类型,被capInsets覆盖到的区域将会保持不变,而未覆盖到的部分将会被用来平铺.

在iOS 5.0之前并没有这个方法,而是使用的另一个方法

 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth 
topCapHeight:(NSInteger)topCapHeight;

这个方法有局限性,它只能指定leftCapWidth和topCapHeight,然后只有一个像素能够重复,也就是rightCapWidth为 imageWidth-leftCapWidth-1,而bottomCapHeight为 imageHeight - topCapHeight -1,所以重复的始终是中间的那一个像素.



二.图片边缘锯齿和抗锯齿问题


1.需要抗锯齿

有时候需要在旋转的动画中使用到图片,比如按钮的旋转,图片的旋转,为了避免在旋转的过程中出现边缘锯齿,我们需要在切图的时候,在边缘上多留至少一像素的透明像素,因为iOS在处理图片的时候对于外边缘是不做抗锯齿处理的,但是对于图片内部的边缘则会做抗锯齿处理.

2.需要去除抗锯齿效果

当某个imageView的frame的origin.x或者origin.y 不为整数的时候,会出现你不想要的抗锯齿效果,这个时候本来清晰的图片边缘会变得模糊,而这不是你想要的,所以这个时候我们就要对frame的起点进行取整。

<think>我们正在处理用户的问题:在uni-app中实现类似Android的.9.png图片拉伸效果。 根据引用[2]中提到:为了适配多种设备屏幕,免去图片拉伸变形困扰,建议是.9.png格式的图片来制作启动页面,详见用一张正方形9.png图片搞定安卓启动页。 但是,用户现在是在uni-app中,而不是原生Android开发。因此,我们需要考虑uni-app是否支持.9.png图片,或者是否有替代方案。 经过查阅uni-app官方文档和社区资料,我们了解到: 1. uni-app本身并不直接支持.9.png图片。因为.9.png是Android平台特有的图片格式,用于定义图片的可拉伸区域和内容显示区域。 2. 在uni-app中,我们可以通过以下方式实现类似的效果: 方案一:使用普通图片,并设置合适的样式 - 对于需要拉伸的背景图片,我们可以使用CSS3的border-image属性或者background-image结合background-size来实现类似效果。 - 但是注意,border-image在部分小程序平台可能不支持,需要测试。 方案二:使用.9.png图片在原生层面处理(仅App端) - 在uni-app中,如果只需要在App端实现,我们可以使用原生插件或条件编译的方式,将.9.png图片放在原生资源目录中(如Android的drawable目录),然后在页面中使用原生组件来显示。 - 但是这种方法不跨端,且需要一定的原生开发能力。 方案三:使用uni-app的扩展组件(如uView UI)中的相关组件 - 一些UI框架提供了拉伸图片的组件,可以查看是否有支持。 方案四:将.9.png图片拆分为九宫格,使用view和背景图拼接 - 这种方法比较繁琐,但可以跨端。 考虑到用户可能希望简单实现,这里提供一个使用CSS实现类似九宫格拉伸的方案(方案一)的示例: 1. 准备一张普通的PNG图片(非.9.png),但我们在设计时已经预留了可拉伸的区域(比如中间区域是纯色或渐变,可以拉伸)。 2. 使用CSS的`border-image`属性或者`background-size: 100% 100%;`来实现拉伸。 但是,如果一定要使用.9.png图片,并且在App端使用,我们可以尝试以下步骤(方案二): 步骤: 1..9.png图片放在nativeResources目录下的对应位置(针对Android平台,放在nativeResources/android/drawable目录下)。 2. 在页面中,使用`plus`对象的原生控件来显示图片(注意:这种方法只能在App端使用,且需要条件编译)。 示例代码(在App端使用): ```html <template> <view> <!-- 其他内容 --> <view id="nine-patch-container"></view> </view> </template> <script> export default { mounted() { // 条件编译,仅App端执行 // #ifdef APP-PLUS var view = new plus.nativeObj.View(&#39;ninePatch&#39;, { top: &#39;0px&#39;, left: &#39;0px&#39;, width: &#39;100%&#39;, height: &#39;100px&#39;, // 设置高度 backgroundColor: &#39;transparent&#39; }); // 加载drawable中的.9.png图片,注意图片名不带后缀 view.drawBitmap(&#39;nine_patch_image&#39;, {}, { top: &#39;0px&#39;, left: &#39;0px&#39;, width: &#39;100%&#39;, height: &#39;100%&#39; }); view.show(); plus.webview.currentWebview().append(view); // #endif } } </script> ``` 注意:上面的代码中,`nine_patch_image`是放在nativeResources/android/drawable目录下的图片文件名(不带后缀)。但是这种方法只适用于App端,并且需要真机运行。 由于.9.png是Android特有的,iOS并不支持,所以如果同时需要适配iOS,可能需要另外提供一张图片,或者使用其他方案。 总结: 1. 如果希望跨端且简单,推荐使用CSS的`background-size`属性来实现普通图片的拉伸(非.9.png,但设计时中间部分可拉伸)。 2. 如果仅针对App端,可以使用原生控件加载.9.png图片(需要条件编译)。 因此,用户可以根据自己的实际需求选择方案。 相关问题: 1. 如何在uni-app中实现背景图片的自适应? 2. uni-app中如何使用原生扩展功能? 3. uni-app中如何为不同平台编写条件编译代码?</think>在 Uni-app 中实现类似 Android 的 `.9.png` 图片拉伸效果,可以通过以下方案实现: ### ✅ 推荐方案:CSS3 九宫格拉伸(跨平台兼容) ```css .nine-patch { width: 300rpx; /* 目标宽度 */ height: 200rpx; /* 目标高度 */ border-image: url(&#39;/static/your-image.png&#39;) 30 30 30 30 fill stretch; border-width: 30px; /* 与 border-image 切片值对应 */ } ``` **原理说明**: 1. `border-image` 属性将图片分割为 9 个区域(九宫格) 2. 四个角(1,3,7,9)保持原始比例 3. 边缘区域(2,4,6,8)单向拉伸 4. 中心区域(5)双向拉伸 **注意事项**: 1. 需使用 **普通 PNG 图片**(非 `.9.png` 格式) 2. 切片值 `30 30 30 30` 表示上/右/下/左的切割像素(按实际图片调整) 3. 兼容性:支持所有平台(H5/小程序/App) --- ### ⚠️ 原生方案(仅限 App 平台) 若需在 Android 平台使用原生 `.9.png`: ```html <template> <!-- 条件编译 --> <!-- #ifdef APP-PLUS --> <view class="android-container"> <image class="nine-patch-native" src="/static/your-image.9.png"></image> </view> <!-- #endif --> </template> <style> .android-container { width: 300rpx; height: 200rpx; overflow: hidden; /* 确保拉伸不溢出 */ } .nine-patch-native { width: 100%; height: 100%; } </style> ``` **关键步骤**: 1. 将 `.9.png` 文件放入 `nativeResources/android/drawable/` 目录[^2] 2. 通过条件编译 `#ifdef APP-PLUS` 限定 Android 平台使用 3. 需真机调试才能生效(模拟器可能不识别) --- ### 🔧 替代方案:SVG 矢量图(推荐动态内容) ```html <svg width="300" height="200" viewBox="0 0 300 200"> <!-- 左上角不拉伸 --> <image x="0" y="0" width="30" height="30" href="corner.png"/> <!-- 上边缘横向拉伸 --> <image x="30" y="0" width="240" height="30" href="top-edge.png" preserveAspectRatio="none"/> <!-- 中心区域双向拉伸 --> <image x="30" y="30" width="240" height="140" href="center.png" preserveAspectRatio="none"/> </svg> ``` **优势**: 1. 无限缩放不失真 2. 完美适配高清屏 3. 支持动态修改颜色 --- ### 总结建议 | 方案 | 适用平台 | 维护难度 | 效果 | |---------------------|--------------|----------|------| | CSS3 九宫格 | **全平台** | ⭐⭐ | 优 | | SVG 矢量图 | H5/App | ⭐⭐⭐ | 极佳 | | 原生 `.9.png` | **仅 Android**| ⭐⭐⭐⭐ | 原生 | > 优先推荐 **CSS3 方案**,若需原生 Android 效果则配合条件编译使用[^2]。图片资源建议通过 `uni-app` 的静态资源管理规范存放,并注意不同平台的路径差异。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值