前几天遇到这样一个问题
我们做的应用客户看了说UI有问题,本来是一个正方形的区域,呈现的结果却是长方形,有些偏差
之后我就开始修改,觉得UI问题肯定是哪里没有设计好,95%是因为xml里面配置错了,这是我第一直觉.
找了一上午,发现xml里面没有问题,定义的确实是正方形区域,也没有任何padding设置.于是下午就在代码中找,看看是不是代码中设置padding
我觉得一般人不会在代码中干这种事情吧,果然,没有找到.汗了!
于是开始debug,代码中也没有什么特别的设置,很崩溃.后来发现setBackgroundResource这个api有些诡异
其中调用了void android.view.View.setBackgroundDrawable(Drawable d),setBackgroundDrawable方法中有这么一句
setPaddingFromDrawable(d, padding);
这是啥......怎么看上去这么诡异,setPaddingFromDrawable有
draw.getPadding(padding)
debug发现,走过这里,padding就被改变了.然后没有继续深入调查,猜测和android:background的设置有关,去掉这个设置,padding不见了
后来美工证实了我的猜想,padding是写在了9patch图片里面.
所以当你在xml和代码中找不到padding的设置,而结果却有padding效果时,那基本应该就是9-patch干的好事了
下面就简单学习下9-patch
拿原生Email为例吧,随便找了个.9图片:attachment_bg_holo.9.png(packages/apps/Email/res/drawable-hdpi)
sdk为我们提供了查看9-patch图片的工具,在tools文件夹下
android-sdk/tools$ ./draw9patch
打开上述图片:
下面几个滑动条看上去很别扭是因为我把工具页面缩小然后他们被挤到一起了
当你滑动patch scale时,右边的预览也会随着改变大小
下面先说说padding在哪
中间的图片四周带有黑线(点)的就是我们打开的.9图片
黑色部分又分为两部分,其中下和右两条黑线(点)控制padding
勾选show lock后会看到图片区域(就是现在我的截图去掉四周一圈)
那么上下左右padding分别是多少呢?
很简单,一个小格子是一个像素
上下左右padding分别是2,3,2,2(要去掉最外圈的格子,因为他们不是图片的一部分)
那么我说的对不对,如何检验,sdk提供了另一个工具在tools文件夹下hierarchyviewer
android-sdk/tools$ ./draw9patch
看到右边的数值了吧.
下面是官方的说明
guide/topics/graphics/2d-graphics.html#nine-patch
You can also define an optional drawable section of the image (effectively, the padding lines) by drawing a line on the right and bottom lines. If a View object sets the NinePatch as its background and then specifies the View's text, it will stretch itself so that all the text fits inside only the area designated by the right and bottom lines (if included). If the padding lines are not included, Android uses the left and top lines to define this drawable area.
下面看看9-patch上边和左边的黑线是做什么的
下面是http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch的图片
我想大家也看明白了,另外的两条线是控制拉伸区域的,可以是一条也可以是多条
下面是官方说明
guide/topics/graphics/2d-graphics.html#nine-patch 写道
The border is used to define the stretchable and static areas of the image. You indicate a stretchable section by drawing one (or more) 1-pixel-wide black line(s) in the left and top part of the border (the other border pixels should be fully transparent or white). You can have as many stretchable sections as you want: their relative size stays the same, so the largest sections always remain the largest
至此,关于9-patch的讲解结束,如有更多需求和疑问请移步下列地址
http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch
http://developer.android.com/reference/android/graphics/NinePatch.html
http://developer.android.com/guide/developing/tools/draw9patch.html
转贴请保留以下链接
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/
- 大小: 18.5 KB
- 大小: 84.8 KB
- 大小: 18.7 KB
分享到:
相关推荐
"android-9.png_的使用教程[参照].pdf"是一个关于解决这一问题的教程,它介绍了Android系统特有的9-Patch图像格式,即`.9.PNG`。 1. **背景自适应与不失真问题** 背景自适应是UI设计中的关键点,尤其是当界面元素...
谷歌提供了Draw9Patch工具(位于android-sdk-windows\tools目录下)来帮助开发者制作9.png图片。首先,你需要一个原始图片,然后将其拖入Draw9Patch工具中。通过工具的界面,你可以手动定义哪些区域可以拉伸,哪些...
在Android开发中,Shape是XML布局资源的一种,用于创建各种图形,如矩形、椭圆、线和梯形等,通常用作自定义View的背景或者Drawable对象。它提供了丰富的属性来实现颜色填充、边框样式以及渐变效果,极大地增强了...
然后运行Draw9Patch.bat(位于android-sdk-windows\tools目录下),将图片拖入工具中。在这里,你可以通过调整边框来定义拉伸区域。例如,如果你想让图片的左右边缘不被拉伸,只需在对应边框上画线即可。完成后,...
尤其是在使用了具有内边距的自定义形状背景或者9-patch图像时,这种现象更为明显。 为了解决这个问题,我们可以采用以下策略:在更改背景资源之前保存原始的padding值,然后再在设置新背景之后恢复这些值。下面是一...
在iOS开发中,有时我们需要对图片进行特定区域的拉伸,以适应不同尺寸的界面,这与Android中的9-patch图概念相似。9-patch图在Android中是一种可伸缩的图片格式,允许开发者指定图像的拉伸区域,确保图片在放大时...
在Android开发中,为桌面图标添加背景框是一种常见的定制化需求,这可以使应用图标看起来更加专业和统一。本文将详细讲解如何在Android中实现这一功能,主要涉及的技术点包括资源文件的修改、图标的XML定义以及...
- 使用`android:background`属性设置背景,这里可以使用一个自定义的九宫格图(.9.png)或者XML drawable文件,该文件可以在`res/drawable`目录下创建。XML drawable允许我们组合图片和颜色,创建复杂背景。 - ...
在Android开发中,进度条(ProgressBar)是一种常见的UI组件,用于显示某个操作的进度或等待状态。本资源“不同形状的进度条源码.zip”提供了一些定制化进度条的源代码,帮助开发者创造出独特且富有视觉吸引力的界面...
你可以在Android Studio的`res/drawable`目录下创建这个文件,并使用图形工具(如Draw9Patch)绘制四个角为圆角的图像。 或者,你也可以在`round_corner_background.xml`中使用Shape Drawable来创建圆角矩形: ```...
一种常见的方法是创建一个圆形或带有圆角的9-patch图片作为背景。另一种方法是自定义一个继承自ImageView的类,并重写`onDraw()`方法,手动绘制圆角矩形。这里展示一个简单的自定义ImageView实现圆角的示例: ```...
2. 使用Nine-Patch 图片:对于更复杂的自定义,可以使用9-patch图片,它允许图像在指定区域拉伸以适应不同尺寸。 3. 自定义Drawable对象:通过创建自定义的`Drawable`类,可以完全控制滑动条的绘制过程,包括滑块和...
本篇将深入探讨如何在Android中实现自定义Button的效果,以及涉及到的相关知识点。 1. **自定义样式与主题** Android支持通过XML来定义按钮的样式。在`res/values/styles.xml`文件中,可以创建一个新样式,并指定...
在Android应用开发中,TextView是不可或缺的UI组件,它用于显示单行或多行文本。`TextViewBackground.zip`这个压缩包可能包含了一个关于自定义TextView背景的示例项目。在这个源码参考中,开发者可能会学习到如何...
5. **位图九宫格**:对于需要拉伸但保持内容不变的位图,可以使用Nine-Patch(9-patch)格式。这种特殊的PNG图片在边缘和角落添加了额外的像素信息,指示哪些部分可以拉伸,哪些部分应保持不变。 6. **引用和组合**...
在Android开发中,TextView是应用界面中不可或缺的组件,它用于显示文本,支持单行或多行展示,并且可以进行各种自定义以满足不同设计需求。本压缩包"Android安卓经典设计学习例程源代码-TextViewBackground.rar...
在Android开发中,按钮(Button)是用户界面中不可或缺的元素,它允许用户与应用程序进行交互,执行特定操作。在Android中,按钮效果通常包括视觉上的点击反馈、动画以及自定义样式。本教程将深入探讨如何在Android...
通过特殊的绘图工具(如Android Studio内置的Draw 9-Patch),开发者可以指定拉伸区域和内容区域。 6. **Drawable的层次结构**: 在LayerDrawable中,可以定义Drawable的堆叠顺序,决定哪个Drawable位于前面。例如...