Nine-patch
NinePatchDrawable图形是可拉伸的位图图片,Android系统会根据View对象中的内容来自动的调整背景图片。使用NinePatch图片的一个例子就是标准Android按钮的背景图片---按钮必须根据字符串的长度来拉伸背景图片。NinePathc图形绘制的是一个标准的PNG图片,它包含了一个像素宽的边框。图片文件的扩展名必须是.9.png,并且要保存到工程的res/drawable/目录中。
边框被用于定义图片的拉伸和静态区域。通过在边框的左边和上边(其他边框的像素应该完成透明或是白色的)绘制一个或多个1像素宽的黑线来指定一个可拉伸的区域。可有多个可拉伸的区域,但它们的相对尺寸都相同,最大的区域始终要保持最大的区域。
还可以通过绘制右边线和底边线来定义一个图片的可选绘制区域(有效的填充线)。如果一个View对象设置NinePatch图片作为它的背景,并且给该View对象指定了文本,那么它就会自我拉伸,以便所有的文本都能够被填充在由右边线和底边线(如果包括的话)所设计的内部区域,如果不包括填充线,Android系统会使用左边线和上边线来定义该绘制区域。
要澄清不同边线间的差异,为了拉伸图片,左边线和上边线定义的图片的像素被允许复制。底边线和右边线定义了图片内相对区域,View对象的内容被允许放到这个区域内。
下图是用于定义按钮的一个NinePatch图片文件:
这个NinePatch图片用左边线和上边线定义了一个可拉伸的区域,用右边线和底边线定义了一个可绘图的区域。为了拉伸图片,在上面的那个图片中,灰色的点划线定指定了图片将要被重复的区域。在下面的那个图片中,粉色的矩形指明了View的内容被允许放置的区域。如果该区域不同完全填充View对象的内容,那么该图片就会被拉伸,直到内容被完全填充。
Draw 9-patch工具,使用WYSIWYG图形编辑器,提供非常方便的创建NinePatch图片的方法。如果定义的可拉伸区域在绘制构件的过程中存在像素复制的风险,它甚至会产生一个警告。
示例XML
该布局XML演示了如何把一个NinePatch图片添加到一对按钮中(NinePatch图片被保存在res/drawable/my_button_background.9.png中):
<Buttonid="@+id/tiny"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:text="Tiny"
android:textSize="8sp"
android:background="@drawable/my_button_background"/>
<Buttonid="@+id/big"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:text="Biiiiiiig text!"
android:textSize="30sp"
android:background="@drawable/my_button_background"/>
要注意的是,宽度和高度属性都被设置成了”wrap_content”,以便按钮能够根据文本尺寸来调整大小。
以下是使用上面显示的图片和XML定义所展现的两个按钮。注意,按钮的宽度和高度是如何根据文本的尺寸来拉伸背景图片的。