Android开发:为何需手动设置ImageView非右侧padding为0适配9Patch聊天气泡?
嘿,这个问题和Android对9Patch图片的默认处理逻辑直接相关,我给你理清楚来龙去脉:
1. 9Patch图片自带的「内容内边距」
你的聊天气泡bubble_right是一张9Patch图,这类图片的核心特性就是可以通过边缘的黑线定义内容显示区域——简单说就是告诉系统:"我的内部哪些区域可以放内容,哪些是气泡的边框"。
当你把9Patch设为View的background时,Android会自动把9Patch中定义的内容区域转化为View的padding值。也就是说,你的这张气泡图大概率在左、上、下三个方向已经内置了非零的内容内边距,系统会自动把这些值应用到ImageView上,哪怕你没在XML里写这些padding属性。
2. 显式padding的优先级
Android的View有个规则:如果显式指定了padding属性,就会覆盖9Patch自带的内容内边距;如果没指定,就会用9Patch的默认值。
你最开始只设置了android:paddingRight="11dp",但左、上、下三个方向的padding还是被9Patch自带的内边距占据了,这就导致图片显示时出现了你不想看到的额外内边距。而当你手动把这三个方向设为0dp时,就直接覆盖了9Patch的默认值,只保留了你需要的右侧内边距,自然显示就符合预期了。
3. 和ImageView属性的交互
你还设置了adjustViewBounds="true"和scaleType="centerCrop",这两个属性会让ImageView根据图片内容调整自身尺寸,并裁剪图片适配区域。如果存在额外的padding(来自9Patch的默认值),就会挤压图片的显示空间,进一步放大内边距异常的问题——这也是为什么你必须手动清除这些默认padding才能让图片和气泡完美适配。
总结一下:你的9Patch气泡图自带了左、上、下方向的内边距,系统自动应用到了ImageView上,只有显式设置这些方向为0dp,才能覆盖默认值,只保留你需要的右侧内边距~
内容的提问来源于stack exchange,提问作者bagage




