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

时间: 2024-08-28 09:22:55

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

Android中margin和padding标签的区别

Android中的margin标签和padding标签到底有什么区别,从以下这段简单的代码图和效果图片就可以看出效果来! 这是一张普通的ImageView载入的图片 下面代码段先加入的部分为android:layout_margin="20dp"得到的效果图片为,此处明显可以看出在图片上方和左侧留出了20个dp单位的空间. 再加入接下来的代码如下:android:paddingLeft="50dp",得到的效果图片为. 那么此处不难看出,margin指的是Image

android中checkbox自定义样式

1.首先res/drawable中定义编写如下样式: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/check_true" android:state_chec

android ListView中CheckBox错位的解决

貌似已经很晚了,但是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,可是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并不是你选中的,百思不得其解.后面通过上网查资料,可是个说纷纭,但是我还是找到了解决办法. 在自定义的适配器中,对checkBox的设置如下: 记住两者的顺序,先对checkBox进行事件监听,再设置其状态.前提在布局中对checkBox的状态设为false. android ListView中CheckBox错位的解决,布布扣,bubuko.

android中padding和margin的理解

在android安排控件布局时,padding和margin经常被用到. 其具体解释可以通过一张图展现,如下, 两个属性表示的意义与web编程相同. 深入理解: padding约束的是控件或布局显示的内容距离边框的距离,沿垂直边框向内压缩,padding越大,内容显示控件越小: margin这是沿垂直边框向外延伸的距离, 它的意思就是给控件加了一个一定距离的空白边,显示效果只与值大小正负相关,与其他元素边界无关. 值得注意的是,padding值的范围[0,任意正数](默认为0),而margin的

Android中ListView与CheckBox结合----多选与记录

很多时候我们会用到ListView与CheckBox结合的东西,比如一个清单,可以用来多选,但是很多人似乎也在这个地方遇到很多问题,我刚开始学的时候也是遇到假选问题,当列表中数量多的之后,我勾选一个,滑动页面会发现条目也勾选上了, 这明显与我们的要求不符合,后来网上找了找资料,用HashMap来记录一个CheckBox的勾选记录就解决了 以下是实现的的一个小Demo 这是XML ListView 每个item文件清单 <?xml version="1.0" encoding=&q

Android中ListView结合CheckBox判断选中项

本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作.通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项. [1] 程序结构图如下: 其中Person.java是实体类,MainActivity.java是Activity组件类.listitem.xml是自定义的列表每项布局文件. [2] listitem.xml布局文件源码如下: [html] 

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

今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个清单页面,我们需要记录用户勾选了哪些条目.这个的实现并不太难,但是有很多朋友来问我如何实现,他们有遇到各种各样的问题,这里就一并写出来和大家一起分享. ListView的操作就一定会涉及到item和Adapter,我们还是先来实现这部分内容. 首先,写个item的xml布局,里面放置一个TextView和一个CheckBox.要注意的时候,这里我设置了C

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

首先:参考了这篇翻译的文章:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 文章中关于说的Android中的Recycler比较模糊,Android会维持屏幕中显示的item+1个对象.但是复用的时候选择哪个对象来复用的机制并不明确,具体用的是什么数据结构,求告知...肯定不是简单的FIFO或LIFO. 关于checkBox,选中了之后,下滑之后返回就消失的问题.有以下两种方式供大家参考: data是给TextVi

android中实现带图片和checkbox的listview

android中实现带图片和checkbox的listview