在我的理解中, 设置 padding 为负值和设置为0在显示上不会有什么区别, 所以, 你想要的效果是什么?

OK, 之前没有自习考虑这个问题, 现在帮你分析一下.

首先, 从 xml 中解析 padding 值是在父类 View 中进行的, 在 View 的 构造方法中可以看到下面的代码:

public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {

....

int attr = a.getIndex(i);

switch (attr) {

case com.android.internal.R.styleable.View_background:

background = a.getDrawable(attr);

break;

case com.android.internal.R.styleable.View_padding:

padding = a.getDimensionPixelSize(attr, -1);

mUserPaddingLeftInitial = padding;

mUserPaddingRightInitial = padding;

leftPaddingDefined = true;

rightPaddingDefined = true;

break;

case com.android.internal.R.styleable.View_paddingLeft:

leftPadding = a.getDimensionPixelSize(attr, -1);

mUserPaddingLeftInitial = leftPadding;

leftPaddingDefined = true;

break;

case com.android.internal.R.styleable.View_paddingTop:

topPadding = a.getDimensionPixelSize(attr, -1);

break;

case com.android.internal.R.styleable.View_paddingRight:

rightPadding = a.getDimensionPixelSize(attr, -1);

mUserPaddingRightInitial = rightPadding;

rightPaddingDefined = true;

break;

case com.android.internal.R.styleable.View_paddingBottom:

bottomPadding = a.getDimensionPixelSize(attr, -1);

break;

// ...

}

....

// setBackground above will record that padding is currently provided by the background.

// If we have padding specified via xml, record that here instead and use it.

mLeftPaddingDefined = leftPaddingDefined;

mRightPaddingDefined = rightPaddingDefined;

if (padding >= 0) {

leftPadding = padding;

topPadding = padding;

rightPadding = padding;

bottomPadding = padding;

mUserPaddingLeftInitial = padding;

mUserPaddingRightInitial = padding;

}

....

internalSetPadding(

mUserPaddingLeftInitial,

topPadding >= 0 ? topPadding : mPaddingTop,

mUserPaddingRightInitial,

bottomPadding >= 0 ? bottomPadding : mPaddingBottom);

....

}

从上面的代码可以看到, 如果通过设置 android:padding 的方式, 那么只有当 padding 值大于等于0才会被赋值给上下左右的 padding. 这就解释了为什么我的实验中 padding 为负值并不会有影响. 同时在调用 internalSetPadding() 方法时, 上下 padding 值都对是否为负值做了判断, 以保证其为正值, 所以我使用你的代码中的参数, 但是将 android:paddingTop 设为负值也没有出现文字不可见的情况.

接下来, View 在自己的区域中如何进行绘制是由每一个 View 的子类自己实现的, 并不是所有的 View 子类都会有设置 paddingLeft 会使内容截断甚至隐藏的情况, 至少目前我试了以后发现只有 TextView 及其子类会. OK, 那看一下 TextView 是怎么绘制文字的:

@Override

protected void onDraw(Canvas canvas) {

....

final int compoundPaddingLeft = getCompoundPaddingLeft();

final int compoundPaddingTop = getCompoundPaddingTop();

final int compoundPaddingRight = getCompoundPaddingRight();

final int compoundPaddingBottom = getCompoundPaddingBottom();

....

canvas.save();

int extendedPaddingTop = getExtendedPaddingTop();

int extendedPaddingBottom = getExtendedPaddingBottom();

final int vspace = mBottom - mTop - compoundPaddingBottom - compoundPaddingTop;

final int maxScrollY = mLayout.getHeight() - vspace;

float clipLeft = compoundPaddingLeft + scrollX;

....

if (mShadowRadius != 0) {

clipLeft += Math.min(0, mShadowDx - mShadowRadius);

....

}

canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom);

....

canvas.translate(compoundPaddingLeft, extendedPaddingTop + voffsetText);

....

mEditor.onDraw(canvas, layout, highlight, mHighlightPaint, cursorOffsetVertical);

....

canvas.restore();

}

....

public int getCompoundPaddingLeft() {

final Drawables dr = mDrawables;

if (dr == null || dr.mShowing[Drawables.LEFT] == null) {

return mPaddingLeft;

} else {

return mPaddingLeft + dr.mDrawablePadding + dr.mDrawableSizeLeft;

}

}

public int getExtendedPaddingTop() {

if (mMaxMode != LINES) {

return getCompoundPaddingTop();

}

....

}

从上面 TextView 类的 onDraw 方法中可以看到, 在

canvas.translate(compoundPaddingLeft, extendedPaddingTop + voffsetText);

这一句中, 画布 canvas 对象进行了平移, 而在这之前并没有对 compoundPaddingLeft 进行负值判定, 因此, 对 TextView 设置 android:paddingLeft 是会使内容文字被截掉的.

所以, 题主想要的"原理"其实很简单, 那就是每一个 View 子类里面的内容怎么绘制是由它的 onDraw() 方法确定的. (当然还有 draw(), dispatchDraw() 这些, 不细说.)

没有android:padding属性,android pading的四个值,为负值时,什么情况下,有效啊相关推荐

  1. 没有android:padding属性,android自定义无上下padding的textview

    因为工作需要需要无上下padding的textview,经过查阅资料,很多说xml中的配置includefontpadding=false,但无法实现0 padding的需要. 也有说通过设置负数的m ...

  2. android padding作用,android:padding和android:layout_margin的区别

    简单点来说: android:padding是内边距,控件本身的内容与控件边缘的距离. android:layout_margin是外边距,控件与其他控件之间的距离. 下面以具体的例子来进行解释: 1 ...

  3. android preference属性,Android进阶——Preference详解之Preference系的基本应用和管理(二)...

    并非我们第一次打开相应界面之后就会自动创建对应的SharedPreferences文件,而是在我们改变了原有状态时候喎�"/kf/ware/vc/" target="_b ...

  4. android layout_width 属性,android:layout_weight属性详解

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提 ...

  5. android开发之android:padding和android:margin的区别

    android:layout_margin:指该控件距离父控件的边距, android:padding: 指该控件内部内容,如文本距离该控件的边距.

  6. android:padding和android:margin的区别

    转载请说明博客地址:http://blog.csdn.net/qq_32059827/article/details/51487997 看了网上的类似博客,并没有给出确定的区别.现在具体分析一下pad ...

  7. android布局属性,Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline...

    相信大家对LinearLayout已经相当熟悉,但你们是否了解它的属性baselineAligned呢? Android官方文档是这么描述的: 那到底这个属性是做什么用的呢? baselineAlig ...

  8. Android 布局属性 Android:layout_weight 总结

    Android 为我们提供了五种布局方式 线性布局:LinerLayout 表格布局:TableLayout 相对布局:RelativeLayout 绝对布局:AbsoluteLayout 帧布局:F ...

  9. android videoview属性,Android VideoView无法播放视频错误,特别是.mp4

    @H_502_1@我正在尝试在我的应用程序中播放视频,但我得不能播放此视频错误.关于这一点,我遇到了很多线索.他们要求在玩家准备好后开始播放视频.我也是这样做的.但无法弄清楚问题.请在下面找到我的代码 ...

最新文章

  1. Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin
  2. Python技术学习之Django框架设计思想
  3. 2019ICPC(上海) - Counting Sequences I(dfs打表)
  4. 性能测试工具比较:LoadRunner vs JMeter - 测试结果数据比较
  5. ManagedObject this[oPropertyInfo._sMutator](oValue);
  6. HashMap Hashtable TreeMap的异同点
  7. html属于什么数据类型,javascript包括哪些数据类型?
  8. 记一次神奇的sql查询经历,group by慢查询优化(已解决)
  9. linux mysql etc inid_Linux下mysql基本操作
  10. Nonebot部署机器人常见问题
  11. 无法将“node.exe”项识别为_CFA二级量化方法分析:线性回归假设的违反,识别与处理!...
  12. 新路由3 Newifi3 D2 刷入breed的方法
  13. LeetCode 494. Target Sume
  14. 常用字符串函数的使用
  15. rk3328摄像头监控
  16. 【表格合并与底纹】vue-elementul表格简单实现合并单元格,与列和行给底纹颜色
  17. USACO 2008 Jan Gold 3.Cell Phone Network 树形dp
  18. 大象做梦传媒写2022年公司大型年会主持稿完整版
  19. 数据信息系统的计算机应用,管理信息系统与计算机应用.ppt
  20. 【亲测可用】 办公图片素材站PPT模板简历模板下载站源码+WAP手机端+采集器+整站数据

热门文章

  1. 《转》TCP的三次握手与四次挥手(详解+动图)
  2. html背景图适应div_CSS实现背景图片屏幕自适应
  3. 【算法】剑指 Offer 57. 和为s的两个数字
  4. 【Flink】TableException: A raw type backed by type information has no serializable
  5. 95-280-048-源码-资源管理-CPU
  6. 【Flink】Flink自定义UDF以及为函数启用别名
  7. mac 下 ~/.bash_profile无效
  8. Kudu : tablet=null, server=null, status=Timed out: can not complete before timeout: Batch
  9. DNS 反向解析出错 Error in named configuration: zone centos.vbird/IN: loaded serial 2011080401
  10. 为什么redis可以做分布式锁