android中checkbox的padding引发的问题
自己定义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 Studio第一次启动的Fetching android sdk component information的问题
- Android 开源项目android-open-project解析之(二) GridView,ImageView,ProgressBar,TextView
- Android 异常 android.os.NetworkOnMainThreadException
- Android studio 2.0--android增量更新的那些事
- 最简单的基于FFmpeg的移动端例子:Android 视频转码器
- Genymotion Android模拟器与fiddler 数据包拦截
- Android USB转串口开发(hoho.android.usbserial串口库)
- Android Studio软件技术基础 —Android项目描述---1-类的概念-android studio 组件属性-+标志-Android Studio 连接真机不识别其他途径
- 《HTML5移动应用开发入门经典》—— 1.5 在iOS和Android设备中使用HTML5
- tensorflow保存模型和加载模型的方法(Python和Android)
- Android数据绑定框架DataBinding用法
- Android: 分页浏览的利器 android View Pager
- Android---- 获取当前应用的版本号和当前android系统的版本号
- Android调用系统关机与重启功能
- Android 数据库升级解决方案
- android Animation 动画效果介绍
- 国外创业者分享之Android 与 iOS:猜猜哪个能让开发者赚得更多
- Android编程 EditView 中如何设置最多可以输入的字符数量 属性 android:ems 与 android:maxLength 的区别
- android 反序列化XmlPullParse之如何创建一个对应的InputStream的对象以便于调用setInput方法
- 【开发工具】Android Studio的使用
- android UI
- Android Touch事件传递机制引发的血案
- Android 系统获取 CPU 位数信息