今天在做一个自定义View的过程中产生了一个奇妙的情况,先来描述一下我的View:
这个View衍生于LinearLayout,由左右两个EditText构成,两者属性基本一致,代码如下:
public TagEditView(Context context, AttributeSet attrs) {
..........
//组件内部Text与自身边界的距离
m_Tag.setPadding(3, 3, 3, 3);
m_EditText.setPadding(3, 3, 3, 3);

//布局属性
m_Tag.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
m_Tag.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
m_Tag.setSingleLine(true);

m_EditText.setWidth(ViewGroup.LayoutParams.FILL_PARENT);
m_EditText.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
m_EditText.setSingleLine(true);
..........} protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
//m_Tag.setHeight(m_Tag.getHeight()+10);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
结果正常,两者对齐,如图:现在少量修改并出现情况如下:
1、 //在构造函数中
m_Tag.setPadding(3,3,3,3); //OnMearsure中
m_Tag.setHeight(m_Tag.getHeight.()+10);
结果正常,两者对齐,如图:2、 //在构造函数中
m_Tag.setPadding(0,0,0,0); //OnMearsure中
//m_Tag.setHeight(m_Tag.getHeight.()+10);
结果异常,两者不对齐,如图:3、 //在构造函数中
m_Tag.setPadding(0,0,0,0); //OnMearsure中
m_Tag.setHeight(m_Tag.getHeight.()+10);
结果正常,两者对齐,如图:
个人想法:很明显padding在background的填充面积上有了影响,但是这种影响似乎是在系统计算View之前产生的从而影响了起面积,当有我们主动在OnMearsure中修改计算量(height)时,原来的padding的作用就被刷新了,从而直接对我们设置的量作出反应。
思绪还是有点凌乱,看下各路英雄都有什么想法?

解决方案 »

  1.   

    这是padding没有任何关系。
    上面的几个图只能说明height的问题,及时你不加padding也是上面几种结果。
    padding只是内边距,和外边距没关系。第二个图的错位只决定于height
      

  2.   

    感谢楼上发言,我找到原因了~原来在构造函数中setWidth和setHeight压根就不起任何作用,必须使用setLayoutParams,然后我翻了些资料,看到onMeasure的过程其实是会把padding的边距也计算上去,也就是说所谓width和height的面积就是包含了padding的面积,background是基于width和height的面积的。
    问题解决,在此结贴!