标签:android checkbox paddingleft compoundbutton
自定义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);
}
}第一种方法:把原始图片缩小,这就就是制作图片了
第二种方法:重写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;
}这真的是花了不少时间,结果发现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;
}
标签:android checkbox paddingleft compoundbutton
原文地址:http://blog.csdn.net/danielinbiti/article/details/39049631