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

android中checkbox的padding引发的问题的更多相关文章

  1. android中checkbox自定义样式

    1.首先res/drawable中定义checkbox_style.xml样式: <?xml version="1.0" encoding="utf-8" ...

  2. 抛砖引玉:关于Android的ListView中CheckBox错乱

    首先:参考了这篇翻译的文章:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 文章中关于说的Android中的Recyc ...

  3. android UI进阶之实现listview中checkbox的多选与记录

    今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...

  4. 【转】android UI进阶之实现listview中checkbox的多选与记录--不错

    原文网址:http://www.cnblogs.com/notice520/archive/2012/02/17/2355415.html 今天继续和大家分享涉及到listview的内容.在很多时候, ...

  5. [转]Android中自定义checkbox样式

    android中自定义checkbox的图片和大小   其实很简单,分三步: 1.在drawable中创建文件checkbox_selector.xml: <?xml version=" ...

  6. Android中ListView结合CheckBox判断选中项

    本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作.通过一个Demo来展示该功能,选中ListView ...

  7. android中的margin和padding

    Android的Margin和Padding跟Html的是一样的.如下图所示:黄色部分为Padding,灰色部分为Margin. 通俗的理解: Padding 为内边框,指该控件内部内容,如文本/图片 ...

  8. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  9. android中的一些问题

    1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...

随机推荐

  1. memcached添加日志输出

    引子:qa的memcached总是隔一段时间挂掉,导致qa进不去.决定查一下原因,于是添加日志输出,等下次出错便于查阅.定位问题. memcache默认没有日志输出.如果想把memecache服务日志 ...

  2. 通过手机音频口,实现与单片机通讯,做电子签名成功n

    手机端的Ukey便携产品, 可以管理证书.加密解密.电子签名 : 1.通讯稳定,生成签名成功率100% 2.证书固化,私钥安全 3.走手机音频接口,通用.跨平台 4.耗电少,自带电池可长期供电,且可充 ...

  3. JVM -XX: 参数介绍

    功能开关: 参数 默认值或限制 说明 参数 默认值 功能 -XX:-AllowUserSignalHandlers 限于Linux和Solaris,默认不启用 允许为java进程安装信号处理器,信号处 ...

  4. 开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表( 附加翻译) h2数据库

    开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表 浪天涯博主翻译: referential integrity 参考完整性transactions 事 ...

  5. Java-方法的覆写

    class  parent {  void print()  {  System.out.println("parent");  } } class child extends p ...

  6. android 高清壁纸设置慢

    由于项目的需要最近在解决一个 bug  在1080p 的手机上面设置壁纸会很慢慢,慢的原因是和壁纸 的大小 有关,壁纸越大,时间直越长,一般1080 p 的壁纸大概有10M左右, 所以通过文件流 来保 ...

  7. oracle维护服务 oracle解决方案 oracle售后服务

        为客户提供的oracle 金牌技术服务内容为: 1.电话服务 (7*24)   热线支持电话800-810-0081   每周7天,每天24小时北京技术支持中心每天都有专人值守.以保证及时与客 ...

  8. 美国保健品品牌介绍之Now Foods

    Now Foods是美国著名的美国保健品品牌,定位于大众品牌. 美国Now Foods公司位于美国伊利诺州,台湾中文名叫健而婷,成立于1968年,是美国保健品市场上名列三甲的国际知名的天然保健品牌,其 ...

  9. (转)SQL查询案例:多行转换为一行

    原文:http://www.cnblogs.com/sammon/archive/2012/05/10/2494362.html 测试表与测试数据 CREATE TABLE TestTitle ( n ...

  10. 将matlab的figure保存为pdf,避免图片太大缺失

    有时画的matlab图太大,或者有太多的子图,导致图太宽,如果直接保存成pdf的话,会导致左右边丢失,显示不下.一个有效又简单的办法是:   1.在matlab figure里面,Edit -> ...