考虑上面的图像。 - 虚线划分了9-Patch png,我将从photoshop文件中切出。我需要它来创建一个弹出框。 - 该盒子包含一个dropShadow,如本照片中的测量工具所示。 - 粉色线条用于显示我将如何使用draw9Patch工具创建9-Patch。
我的问题是:如果我有一个带有9-Patch的View“容器”作为背景,我需要确保其子视图始终位于白框内。我打算用这个填充。我打算将填充设置为与测量工具相等。因此,如果它在photoshop中为30px,我将为容器设置layout_paddingLeft"=30dp"
。 (设计是在MDPI,所以我假设这个转换是可以的)。但是,不同密度的屏幕如何处理9路径。例如,测量区域 30px 或 30dip ?
答案 0 :(得分:23)
通过draw9patch
工具,您可以定义:
请注意,拉伸像素不必是连续的,因此您可以从拉伸中排除某些特定切片(请查看上面的弹出箭头)。同时,您可以合理地了解您的内容放置位置,只需看一下右边的预览,紫色区域就可以了。正如您所想,这样您就不必指定任何填充在您的布局中:视图将使用您设置为背景的9patch 来考虑这些值。
无拉伸区域随像素密度而变化。因此,如果您将上面的9patch设置为mdpi
资源,则最左上角的切片将以50x40像素区域@mdpi呈现,并在100x80像素区域中呈现@xhdpi。最左边的拉伸区域根据dpi排列它们的宽度,而高度根据内容排列。其他拉伸切片也以类似的方式工作。
在这两种情况下,处理“低分辨率”9patch都会导致丑陋的像素化伪像。一种可能的解决方案是为每个支持的dpi提供不同的9patch,或者仅定义更高的dpi(xhdpi)并让Android相应地缩小它们。
内容边界也被视为dp
,因此它们会根据像素密度进行缩放。例如:在原始9patch中定义的左边填充为40px @ mdpi,将在80px @ xhdpi中进行转换,因此内容将永远不会流出给定的边界。 请注意,您甚至可以通过布局中的padding*
属性覆盖9patch中指定的内容范围。