您的位置:首页 > 移动开发 > Android开发

android中checkbox的padding引发的问题

2016-04-03 11:13 459 查看
自己定义checkbox中的勾选框图标。这次由于想偷懒。图标弄的大了些。然后一系列的问题就都引出来了。

1、图标比checkbox的layout_height高。看不见了。

非常吐血吧,CompoundButton中的源代码能够看到以下代码

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

final Drawable buttonDrawable = mButtonDrawable;
if (buttonDrawable != null) {
final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
final int height = buttonDrawable.getIntrinsicHeight();//能够看到是依据图片的原始高度对图片进行绘制的,,danielinbiti

int y = 0;

switch (verticalGravity) {
case Gravity.BOTTOM:
y = getHeight() - height;
break;
case Gravity.CENTER_VERTICAL:
y = (getHeight() - height) / 2;
break;
}

buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height);
buttonDrawable.draw(canvas);
}
}


从这里能够看到是依据图片的高度进行绘制的。而不是依据你设置的layout_height进行图片缩放。

所以解决的途径也就两种:

第一种方法:把原始图片缩小,这就就是制作图片了

另外一种方法:重写onDraw方法

@Override
protected void onDraw(Canvas canvas) {
setButtonDrawable(parentds);//danielinbiti,<span style="font-family: Arial, Helvetica, sans-serif;">parentds是</span><span style="font-family: Arial, Helvetica, sans-serif;">occupyPosDrawable方法返回的。

</span><span style="font-family: Arial, Helvetica, sans-serif;">
</span>        super.onDraw(canvas);
setButtonDrawable(ds);//真正要显示的图片
final Drawable buttonDrawable = ds;
if (buttonDrawable != null) {
final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
final int drawableHeight = buttonDrawable.getIntrinsicHeight()>selfHeight
?

selfHeight:buttonDrawable.getIntrinsicHeight();
final int drawableWidth = buttonDrawable.getIntrinsicWidth()>selfHeight
?

selfHeight:buttonDrawable.getIntrinsicWidth();
//<span style="font-family: Arial, Helvetica, sans-serif;">selfHeight为要定义的图片高度</span>
int top = 0;
switch (verticalGravity) {
case Gravity.BOTTOM:
top = getHeight() - drawableHeight;
break;
case Gravity.CENTER_VERTICAL:
top = (getHeight() - drawableHeight) / 2;
break;
}

int left = 0;
int right = left+drawableWidth;
int bottom = top+drawableHeight;

buttonDrawable.setBounds(left, top, right, bottom);
buttonDrawable.draw(canvas);
}
}
// drawable 转换成bitmap
private Drawable occupyPosDrawable(int height){//
Picture p=new Picture();
Canvas c=p.beginRecording(height,height);
p.endRecording();

PictureDrawable pd=new PictureDrawable(p);

return pd;
}


2、当这个解决后。自以为已经完毕了。结果定义了paddingLeft后。问题出现了。在4.1.2版本号不正常了(图片和文字叠在一起了)。在4.2.2版本号中正常显示了paddingLeft

这真的是花了不少时间,结果发现4.1.2版本号中CompoundButton没有getCompoundPaddingLeft。这不坑人嘛。

两个版本号的计算方式不一样,4.2.2版本号绘制文字时。会把图片的宽度和paddingLeft的宽度加上,而4.1.2版本号仅仅计算设置的paddingLeft,从这里看也是4.2.2版本号人性化一些。

于是又查了一下前后版本号,发现4.1.2版本号是分界线。兴许版本号CompoundButton都有getCompoundPaddingLeft方法。

于是又重写了getCompoundPaddingLeft方法。依据版本号推断

@Override
public int getCompoundPaddingLeft() {
int padding = super.getCompoundPaddingLeft();
if(getAndroidSDKVersion()<=16){//4.1.2
if (!isLayoutRtl()) {
padding = selfHeight + padding;
}
}
return padding;
}


到这里。基本就定义了一个自己的checkbox。

图片大小就不用太在意了,能够依据自己设定的大小把对图片进行缩放。在app应用中相对照较灵活些,同一时候也发现了一个android的版本号差异性问题。曾经用checkbox的时候基本没有设置过paddingLeft,还真没有注意这个问题(由于不设置两个版本号都正常。仅仅是贴这图片)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: