9.png图片的处理

article/2025/9/14 19:07:59
1. PNG格式。
      在这里不过多的讨论PNG格式的定义问题。但是.9.PNG确实是标准的PNG格式,只是在最外面一圈额外增加1px的边框,这个1px的边框就是用来定义图片中可扩展的和静态不变的区域。特别说明,left和top边框中交叉部分是可拉伸部分,未选中部分是静态区域部分。right和bottom边框中交叉部分则是内容部分(变相的相当于定义看一个内边距,神似padding功能,后面我会单独介绍一下),这个参数是可选的, 如下图。
在Android中以9.PNG格式的图片未背景,则能够自定义拉伸而不失真,比如系统的Button就是一个典型的例子。
其实呢,无论是left和top,还是right和bottom都是把图片分成9块 (边角四块是不能缩放的,其他的四块则是允许缩放的),所以叫做9.PNG。

2. 使用Draw9Patch.jar制作9.PNG图片之定义拉伸区域。
前面已经了解到9.PNG格式的工作方式,下面我们使用谷歌提供的Draw9Patch(运行android-sdk-windows\tools目录下的Draw9Patch.bat)来制作.9.PNG图片。
第一步:准备要拉伸的图片。

非常小的一张图片,我希望以此为背景,中间部分填充文章内容。
第二步:制作.9.PNG图片
打开Draw9Patch,把图片拖进去,如下:

默认的拉伸是整体拉伸,其实边框部分我们并不想拉伸,好,我们自己来定义拉伸区域,如下图:

然后点击File,导出为content.9.png。
第三步:在layout文件中使用制作的 .9.PNG图片.
新建工程Draw9Patch,默认主Activity为Draw9PatchActivity.java:

?
1
2
3
4
5
6
@Override
public void onCreate(Bundle savedInstanceState)
{
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
}

我们把content.9.png文件拷贝到/res/drawable文件夹下,打开/res/layout目录下的main.xml,申明如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:background = "#777"
android:padding = "8dip"
>
< TextView
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:text = "正文:A NinePatchDrawable graphic is a stretchable bitmap image."
android:background = "@drawable/content"
android:textColor = "#000"
/>
</ LinearLayout >

如图,

我们修改text,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:background = "#777"
android:padding = "8dip"
>
< TextView
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:text = "正文:A NinePatchDrawable graphic is a stretchable bitmap image, which Android will automatically resize to accommodate the contents of the View in which you have placed it as the background. A NinePatch drawable is a standard PNG image that includes an extra 1-pixel-wide border."
android:background = "@drawable/content"
android:textColor = "#000"
/>
</ LinearLayout >

如图,

可以看出,边框非常的清晰。下图是未使用.9.PNG的对比图,而且也不是我们要的效果:

到这里为止,我们已经基本会制作.9.PNG图片了。为了知识体系的全面性和深入性,我们继续。

3.使用Draw9Patch.jar制作9.PNG图片之定义内容区域。
是不是觉得文字和边距挨的太近,好,我们使用right和bottom边的线来定义内容区域,来达到增大内边距的目的。

我们定义了一个很小的内容区域,其他的地方则自动充当边框,从而使内边距显的很大,如下图,

在这里,我要特别说明,一开始为了增大内边距,很容易惯性思维,在<TextView>中申明android:padding="10dip" 之类的,我在这里劝告朋友们不要这么做,一是你将无法预知你的显示,二是这比较混淆,因为设置内容区域就是确定padding,所以我在前面部分说他们是神似。我个人认为通过内容区域设定padding比在布局xml中定义padding更优雅,更简洁!
关于Draw9Patch工具的其他使用说明,我在次不再累述,因为要说的话太多,为了节省篇幅,请参考官方文档。

4.制作.9.PNG的高级技巧。
对于初学Draw9Patch的人来说,这可以算是高级技巧,那就是:拉伸区域,可以不是连续的,可以不止一块,而且是和自定义的边框线的长度成正比。
直接上图说明:

5.SDK中如何处理9.PNG图片。
SDK专门针对9.PNG做了定义和处理,这里我们只是做个简单的流程分析,Bitmap在读取图像流数据的时候,会把判断图片的NinePatchChunk(9Patch数据块),如果NinePatchChunk不为空,则是NinePatchDrawable,NinePatchDrawable则又会交给NinePatch处理:

?
1
2
3
setNinePatchState( new NinePatchState(
new NinePatch(bitmap, bitmap.getNinePatchChunk(), "XML 9-patch" ),
padding, dither), r);

NinePatch检验成功则调用本地方法,绘制出最终的图片:

?
1
2
3
nativeDraw(canvas.mNativeCanvas, location,
mBitmap.ni(), mChunk, paint != null ? paint.mNativePaint : 0 ,
canvas.mDensity, mBitmap.mDensity);

6.android系统中大量应用了9.PNG图片。
通过解压随便一个rom,找到里面的framework_res.apk,里面有大量的9.PNG格式文件,被广泛的应用起来,比如常见的有:
按钮:
解锁:
下拉框:
标题栏:
Toast:
还有搜索,键盘,放大缩小控件,时间加减等等,我就不一一列举。

7.最后送上一些图例,以飨读者,以做后鉴:

赏图1 本人之作

赏图2 下拉按钮

赏图3 文章头部背景

赏图4 系统头部背景


http://chatgpt.dhexx.cn/article/hJXNDK8F.shtml

相关文章

如何在线压缩png图片?png压缩图片大小的方法介绍

压缩PNG图片大小的优点 随着数字化时代的发展&#xff0c;PNG格式已成为一种常见的图片格式。然而&#xff0c;由于高分辨率、高色深等原因&#xff0c;PNG图片通常具有较大的文件体积&#xff0c;导致在传输、存储和网页加载等方面会产生不必要的负担。因此&#xff0c;对于需…

InternImage

终于有对抗Transformer 的了~~ 来自浦江实验室、清华等机构的研究人员提出了一种新的基于卷积的基础模型&#xff0c;称为 InternImage&#xff0c;与基于 Transformer 的网络不同&#xff0c;InternImage 以可变形卷积作为核心算子&#xff0c;使模型不仅具有检测和分割等下游…

图片<img>

图像标签演示源代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图像标签</title> </…

拉伸图片的两种方法

在开发时&#xff0c;常常会遇到一个图片作为控件的image显示时&#xff0c;图片太小&#xff0c;此时图片被拉伸后,图片四周显示的并不是我们想要的结果&#xff0c;此时我们就需要对图片进行拉伸操作&#xff0c;有两种方法可以去拉伸图片&#xff0c; 一种是进入资产文件夹中…

css控制图片拉伸不变形,css+background实现 图片宽高自适应,拉伸裁剪不变形

图片宽高不固定 &#xff0c;一样实现自适应&#xff0c;拉伸裁剪不变形&#xff0c;适应各大兼容性。 下面咱们在网上找两张宽高不一样的照片&#xff1a; No.1 No.2 从上图看一个宽的一个窄的&#xff0c;很难做到自适应&#…

html背景图片 纵向拉伸,背景图片拉伸(CSS方法)_html/css_WEB-ITnose

在布局现在的网站首页的时候&#xff0c;发现一个问题。我使用了一张1440*900的png图片作为背景图片。页面内的Div使用了较多的百分比自适应框体大小&#xff0c;原body元素的CSS如下 html { width: 100%; height: 100%;}body { background: url(../img/bg.png) no-repeat; mar…

ios图片局部拉伸

转载自http://justsee.iteye.com/blog/1973358 下面张图片&#xff0c;本来是设计来做按钮背景的&#xff1a; button.png&#xff0c;尺寸为&#xff1a;24x60 现在我们把它用作为按钮背景&#xff0c;按钮尺寸是150x50&#xff1a; C代码 // 得到view的尺寸 CGSize viewS…

Qt部分拉伸的背景图片

目录 引言代码实现 引言 QSS是Qt客户端开发中非常重要的一环&#xff0c;也是非常容易被忽略的一环。因为网上有太多的博文直接给出了相对美观的样式&#xff0c;导致多数人只是将样式表拷贝使用&#xff0c;而没有细究其中的语法。这也是我在面试时分辨Qt界面开发经验的重要标…

android 九宫格 拉伸,CAScale9ImageView(九宫格图片拉伸)

类说明 CAScale9ImageView是CrossApp提供的一种九宫格拉伸图片的解决方案,我们先来了解一下什么是九宫格图片拉伸。 在App的设计过程中,为了适配不同的手机分辨率,图片大小需要拉伸或者压缩,这样就出现了可以任意调整大小的拉伸样式。 CAScale9ImageView 属性(点击方法名可…

Android自适应拉伸图片

这篇文章是android开发人员的必备知识&#xff0c;内容摘选自网络&#xff0c;友我为大家整理和总结&#xff0c;不求完美&#xff0c;但是有用。 视频教程地址&#xff1a;http://player.youku.com/player.php/sid/XMTMwODc3Njc2/v.swf 1.背景自适应且不失真问题的存在 制作自…

android 图片自动拉伸,解决关于ImageView自适应的问题(拉伸变形,图片模糊)

今天接手一个项目发现有个地方的图片显示非常小&#xff0c;而且还不够清晰&#xff0c;也没办法自适应屏幕的显示&#xff0c;非常的影响美观&#xff0c;于是 就像这优化一下。 先看看优化前的效果和优化后的效果。 修复后 修复前 布局文件修复前&#xff1a; 修复前 布局文件…

html背景图片纵向拉伸,html网页背景图片拉伸 关于html背景图片往下拉伸问题

html 如何让背景图片充满全图&#xff0c;就是拉伸 html语言背景图片拉伸代码&#xff1a;background-size:cover&#xff0c;可以使图片拉伸铺满背景。 拓展资料 背景 (background) 属性定义元素的背景效果 元素的背景区包括前景之下直到边框边界的所有空间。因此&#xff0c;…

android 拉伸图片

Android拉伸图片用的是9.png格式的图片&#xff0c;这种图片可以指定图片的那一部分拉伸&#xff0c;那一部分显示内容&#xff0c;美工给的小图片也能有很好的显示效果。 原背景图片 可以看到原背景图片很小&#xff0c;即使在再长的文字&#xff0c;背景图片的圆角也不会拉伸…

html js 修改img 图片不拉伸,防止图片拉伸的自适应处理

在web开发中,作为前端经常会遇到处理图片拉伸问题的情况。 例如banner、图文列表、头像等所有和用户或客户自主操作图片上传的地方, 而一旦牵扯图片,就会涉及到图片拉伸的问题, 当然,在图片上传时做手动裁切,让用户或客户清晰的感知到图片的有效内容才是最优的解决方案,…

html平铺 拉伸 图片,[CSS]背景图片中平铺与拉伸

在某业务场景下,需要支持背景图的平铺和拉伸,那么在CSS中的这俩属性表现有何区分关系到是否符合业务表现,因此有必要清晰知道其差别。 原本以为只有自己会遇到,没想到群里有小伙伴也问到了。 0x00 background-size 在CSS中有background-size属性,平铺与拉伸可以通过下面两…

html 如何完美的显示图片,不拉伸图片,完整显示等等。

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

html插入背景图片如何拉伸,css怎样拉伸背景图片?

在css中可以使用background-size属性来拉伸背景图片。background-size属性规定背景图像的尺寸&#xff0c;此属性可以使用数值、百分比、cover等设置图片拉伸。 background-size属性规定背景图像的尺寸。 语法&#xff1a;background-size: length|percentage|cover|contain; 属…

html如何拉伸一个图片,css怎么拉伸图片?

css可以使用background-size属性设置图片拉伸&#xff0c;background-size属性规定背景图像的尺寸。此属性可以使用数值、百分比、cover等设置图片拉伸。 background-size属性规定背景图像的尺寸。 background-size属性介绍&#xff1a; 语法&#xff1a;background-size: leng…

html 图片纵向拉伸,css如何让图片拉伸?

css设置图片拉伸的方法&#xff1a;1、使用width与height属性强制设置图片大小使图片拉伸。2、使用background-size属性拉伸背景图片。 1、强行设定大小值会导致拉伸 示例&#xff1a;//html .... //css img{ width: 80px; height: 80px; margin-right: 10px; } 效果图&#xf…