自定义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,还真没有注意这个问题(因为不设置两个版本都正常,只是贴这图片)


更多相关文章

  1. Android(安卓)Studio如何更改JDK和SDK的路径?
  2. Android(安卓)studio 百度地图开发(2)地图定位
  3. Adapter 优化图片复用,导致界面图片出现闪烁效果
  4. android AndroidManifest.xml文件解析
  5. Android(安卓)Dialog Activity
  6. Android权限总结
  7. Android布局管理(4)
  8. Android(安卓)Hacks:同时启动多个Intent
  9. Android开发之MediaPlayer使用

随机推荐

  1. NoClassDefFoundError: android/os/Persi
  2. Android(安卓)音视频开发(二) -- Camera1
  3. Android(安卓)Event事件传递机制总结
  4. Android系统开发
  5. Android对话框AlertDialog.Builder使用方
  6. Android(安卓)使用OKHttp获取字符串和下
  7. [Network]Android(安卓)N 新wifi connect
  8. Android临时和永久关闭selinux
  9. android PowerManager goToSleep 等用法
  10. Android(安卓)Force Close 出现的异常原