9-Patch可绘制尺寸Android。不同密度如何处理未拉伸区域?

时间:2013-02-20 05:06:10

标签: android drawable nine-patch

enter image description here

考虑上面的图像。 - 虚线划分了9-Patch png,我将从photoshop文件中切出。我需要它来创建一个弹出框。 - 该盒子包含一个dropShadow,如本照片中的测量工具所示。 - 粉色线条用于显示我将如何使用draw9Patch工具创建9-Patch。

我的问题是:如果我有一个带有9-Patch的View“容器”作为背景,我需要确保其子视图始终位于白框内。我打算用这个填充。我打算将填充设置为与测量工具相等。因此,如果它在photoshop中为30px,我将为容器设置layout_paddingLeft"=30dp"。 (设计是在MDPI,所以我假设这个转换是可以的)。但是,不同密度的屏幕如何处理9路径。例如,测量区域 30px 30dip

1 个答案:

答案 0 :(得分:23)

通过draw9patch工具,您可以定义:

enter image description here

  • 垂直拉伸:左侧的黑色像素
  • 水平拉伸:顶部的黑色像素
  • 垂直内容:右侧的黑色像素
  • 水平内容:底部的黑色像素

请注意,拉伸像素不必是连续的,因此您可以从拉伸中排除某些特定切片(请查看上面的弹出箭头)。同时,您可以合理地了解您的内容放置位置,只需看一下右边的预览,紫色区域就可以了。正如您所想,这样您就不必指定任何填充在您的布局中:视图将使用您设置为背景的9patch 来考虑这些值。

无拉伸区域随像素密度而变化。因此,如果您将上面的9patch设置为mdpi资源,则最左上角的切片将以50x40像素区域@mdpi呈现,并在100x80像素区域中呈现@xhdpi。最左边的拉伸区域根据dpi排列它们的宽度,而高度根据内容排列。其他拉伸切片也以类似的方式工作。

在这两种情况下,处理“低分辨率”9patch都会导致丑陋的像素化伪像。一种可能的解决方案是为每个支持的dpi提供不同的9patch,或者仅定义更高的dpi(xhdpi)并让Android相应地缩小它们。

内容边界也被视为dp,因此它们会根据像素密度进行缩放。例如:在原始9patch中定义的左边填充为40px @ mdpi,将在80px @ xhdpi中进行转换,因此内容将永远不会流出给定的边界。 请注意,您甚至可以通过布局中的padding*属性覆盖9patch中指定的内容范围。