当前位置: 首页 > 编程笔记 >

Android CheckBox中设置padding无效解决办法

邢法
2023-03-14
本文向大家介绍Android CheckBox中设置padding无效解决办法,包括了Android CheckBox中设置padding无效解决办法的使用技巧和注意事项,需要的朋友参考一下

Android CheckBox中设置padding无效解决办法

CheckBox使用本地图片资源

CheckBox是Android中用的比较多的一个控件,不过它自带的button样式比较丑,通常都会替换成本地的资源图片。使用本地资源图片很简单,设置android:button属性为一个自定义的包含selector的drawable文件即可。

例如android:button=”@drawable/radio_style”。radio_style.xml定义如下。checked和unchecked分别是选中和未选中时使用的图片资源。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_checked="true" android:drawable="@drawable/checked"></item>
  <item android:state_checked="false" android:drawable="@drawable/unchecked"></item>
</selector>

CheckBox点击响应问题

当CheckBox使用本地的图片资源后,如果本地图片很小(图片大小需要和布局搭配,很多时候为了界面的美观不能使用太大的图片),而且右侧没有文字时,会导致CheckBox很难被点中。增加点击区域,通常的做法是增加padding值,扩大控件的外部范围。我们希望可以通过设置CheckBox的padding值,让图片的上下左右四个方向都增加一定的范围,这样用户点击图片的响应上就不会有问题了。

CheckBox padding失效问题

CheckBox分别设置上、下、左、右和全部四个方向各20dp的padding后实际显示效果如图所示。这里为了看得清楚,为CheckBox设置了背景色,并且添加了文字。

从图示可以看出,CheckBox设置padding值影响的是实际上文字到CheckBox边界的距离,图片始终在左侧垂直居中的位置。
先看上下padding,当设置上下padding时,由于文字本身距离上下边界就有一定的距离,如果padding值设置的不够,整个CheckBox区域根本不会变化,通过设置较大的padding值可以实现扩大CheckBox上下区域的目的。最后一张图上下各20dp的padding,这时可以看到CheckBox高度增加了。但由于中间文字距离上下边界的距离和CheckBox图片高度,文字字号,文字内部padding等很多因素有关,很难通过对上下padding设置精确控制CheckBox区域,很可能出现在这个手机上高度被拉的很大,而另一个手机上根本没有效果。

再看左右padding,当设置左右padding时,无论是左padding还是右padding,影响的只是文字的位置。图片始终都在整个CheckBox的左侧,对图片来说,增大的都是右侧区域。所以设置的左右padding不能解决CheckBox点击响应的问题,不仅会导致图片位置偏左,还会出现点击左侧区域无法点中的情况。

标题中所说的padding无效问题,实际上是有效的,只是设置paddingLeft增加的是右边区域,paddingTop和paddingBottom只有设置较大的值才能看到效果。

CheckBox padding失效问题原因

要想知道CheckBox padding失效问题原因,得要查看Android源码,CheckBox是继承自CompoundButton,CheckBox左侧的图片是在CompoundButton的onDraw()方法中绘制的,onDraw()方法代码如下,mButtonDrawable就是要绘制的图片对应的Drawable对象,可以看到left始终为0,而top位置和Grivity有关(上述例子中Gravity是居中的)。

@Override
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 drawableHeight = buttonDrawable.getIntrinsicHeight();
    final int drawableWidth = buttonDrawable.getIntrinsicWidth();

    int top = 0;
    switch (verticalGravity) {
      case Gravity.BOTTOM:
        top = getHeight() - drawableHeight;
        break;
      case Gravity.CENTER_VERTICAL:
        top = (getHeight() - drawableHeight) / 2;
        break;
    }
    int bottom = top + drawableHeight;
    int left = isLayoutRtl() ? getWidth() - drawableWidth : 0;
    int right = isLayoutRtl() ? getWidth() : drawableWidth;

    buttonDrawable.setBounds(left, top, right, bottom);
    buttonDrawable.draw(canvas);
  }
}

解决CheckBox点击响应问题

由于CheckBox和CompoundButton没有提供任何方法设置图片的位置,要想解决CheckBox点击响应的问题似乎唯一的方法就是重写一个新的控件,然后在onDraw方法中确定图片位置时把padding也考虑进去。不过这样做实在是太麻烦了。

这里给出另外一种简单的方法,那就是将图片扩大。CheckBox点击响应问题本身是由于图片过小,如果将图片扩大就不存在这个问题了,但前面说之所以用小的图片是为了布局搭配和界面美观,如果将图片扩大不是又回到最开始的问题了吗!
其实这里说的图片扩大,不是将图片整体放大,而是图片内容不变,在原先的图片外围增加透明像素,由于透明像素不可见,图片看起来的实际大小仍然和以前一样,但由于透明像素的存在,CheckBox的区域也会随之增大。

要在图片外网增加透明像素前提是图片必须是png格式的,不过这并不是问题,通常资源文件都是png格式的,即使不是png格式的图片,也可以先转换成png格式,然后再增加透明像素。

增加透明像素的方法也很简单,用Photoshop打开png图片,然后选择“图像”–“画布大小”,然后输入新的大小就可以了。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 本文向大家介绍JS设置时间无效问题的解决办法,包括了JS设置时间无效问题的解决办法的使用技巧和注意事项,需要的朋友参考一下 在发送短信息验证码的时候要用到js设置时间倒序问题:有时候这种常规写法会导致js失效,试了很多方法才找到问题所在,可能是因为js版本过低导致。 解决方法: 或者: jquery代码:必须用input设置value值,以便利用jquery更改value值 以上所述是小编给大家介

  • 本文向大家介绍ASP.NET在MVC中MaxLength特性设置无效的解决方法,包括了ASP.NET在MVC中MaxLength特性设置无效的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ASP.NET在MVC中MaxLength特性设置无效的解决方法。分享给大家供大家参考。具体分析如下: 一、问题: 在ASP.NET MVC项目中,给某个Model打上了MaxLength特性如

  • 本文向大家介绍BootStrap 标题设置跨行无效的解决方法,包括了BootStrap 标题设置跨行无效的解决方法的使用技巧和注意事项,需要的朋友参考一下 最近在使用BootStrap的表格做一个报表界面(不需要报表的功能,只需要预览并且行列定好无需根据数据量变化,如有更好的框架欢迎推荐。),发现标题设置跨行属性rowspan无效。html如下: 效果如下: 可以看到图上效果,“功能分类”这个单元

  • 本文向大家介绍JQuery 设置checkbox值二次无效的解决方法,包括了JQuery 设置checkbox值二次无效的解决方法的使用技巧和注意事项,需要的朋友参考一下 在此MVC ASP.NET 项目,我利用jquery ajax传输数据给后台controller控制层,返回数据给JQuery数据。 首先必须清除checkbox的选中,因为是ajax的异步操作,是不刷新页面的,所以需要手段充值

  • 本文向大家介绍ios10以下safari设置style无效的解决方法,包括了ios10以下safari设置style无效的解决方法的使用技巧和注意事项,需要的朋友参考一下 项目中遇到的奇怪问题,已定位原因。Attempted to assign to readonly property报错 起因:项目中写了个点击事件,增加动态效果,类似于转一转,rotate(360)。很简单的一个特效。 设置元素

  • 本文向大家介绍layui中select,radio设置不生效的解决方法,包括了layui中select,radio设置不生效的解决方法的使用技巧和注意事项,需要的朋友参考一下 废话不多说,大家来看吧! 点击编辑取消disabled 以上这篇layui中select,radio设置不生效的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 呐喊教程。